我在让 Sinon 的 stub 为我正常工作时遇到问题。当我在 list
上 stub retro
并且测试运行时,app.get('/retro', retro.list)
正在执行原始函数 retro.list
而不是 stub 。由于发生这种情况,测试失败,因为 stub 的 callCount
为 0。
我更熟悉coffeescript,我也用同样的方式处理过事情。有什么我不了解 Javascript 的范围,或者 require('../routes/retro')
是如何工作的,或者 retro
和 app.js
中的 test.js
不一样。
非常感谢下面的帮助和代码。
测试.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();
})
})
})
应用程序.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;
复古.js:
var retro = {
list: function(req, res){
console.log('actual called');
res.send("respond with a resource");
}
}
module.exports = retro;
最佳答案
在要求/创建 app
之前,您可能需要创建 stub 。
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'
路由已经拥有的副本。关于javascript - 调用原始函数而不是 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18006010/