我有一个问题,让西农的存根正确地为我工作。当我在list上存根retro并运行测试时,app.get('/retro', retro.list)正在执行原始函数retro.list而不是存根。由于这种情况发生,所以测试失败,因为存根的callCount是0。
我对coffeescript更熟悉,我也用同样的方式处理过一些事情。对于Javascript的作用域,或者require('../routes/retro')是如何工作的,或者retro在app.js和test.js中是不一样的,有什么我不理解的。
非常感谢下面的帮助和代码。
test.js:
var request = require('supertest')
, retro = require('../routes/retro')
, app = require('../app')
, sinon = require('sinon');
require('should');
describe('GET /retro', function() {
// less involved, but maybe stupid to test
it('should call retro.list', function(done) {
var stub = sinon.stub(retro, 'list');
request(app)
.get('/retro')
.end(function(err, res){
stub.callCount.should.equal(1);
if (err) return done(err);
done();
})
})
})app.js:
var express = require('express')
, config = require('./config')
, routes = require('./routes')
, retro = require('./routes/retro');
var app = express();
config(app);
app.get('/', routes.index);
app.get('/retro', retro.list);
module.exports = app;retro.js:
var retro = {
list: function(req, res){
console.log('actual called');
res.send("respond with a resource");
}
}
module.exports = retro;发布于 2013-08-01 23:16:56
您可能需要在要求/创建app之前创建存根。
var request = require('supertest')
, sinon = require('sinon')
, retro = require('../routes/retro');
var stubRetroList = sinon.stub(retro, 'list');
var app = require('../app');
// ...
stubRetroList.callCount.should.equal(1);这允许在传递到路由之前更新retro.list:
app.get('/retro', retro.list);这个问题可能是因为retro.list不是通过引用(指针)传递的,而是一个按值传递(复制)的引用。因此,尽管sinon.stub()正在改变retro.list,但它不会影响'/retro'路由已经拥有的副本。
发布于 2017-12-23 01:46:15
我也面临着同样的问题,被接受的答案(虽然是真的)对我毫无帮助。结果表明,为了使sinon存根工作,不能在同一个模块中使用存根方法。换句话说,阻塞模块端点只会存根模块端点,而不是module.exports引用的函数的内部使用情况。
通过一个例子解释:
module.js
const express = require('express')
const router = express.Router()
router.get('/', function (req, res) {
res.status(200).json(list())
})
function list() {
return ['something']
}
module.exports = {
router: router,
list: list
}module.spec.js
// This stub will not work
sinon.stub(module, 'list').callsFake(() => ['something else'])为了使其工作,您可以将想要存根的内容分离到它自己的模块中,并以这种方式使用它:
sub_module.js
function list() {
return ['something']
}
module.exports = {
list: list
}现在,sub_module.list()可以被短截。
(OP定义了一个适当的方法,所以这对他来说不是问题)
https://stackoverflow.com/questions/18006010
复制相似问题