Javascript Sinon-带回调的存根函数-导致测试方法超时
我在快速路线上有一个方法,如下所示:Javascript Sinon-带回调的存根函数-导致测试方法超时,javascript,node.js,express,mocha.js,sinon,Javascript,Node.js,Express,Mocha.js,Sinon,我在快速路线上有一个方法,如下所示: exports.register_post = function(req, res) { var account = new Account(); account.firstName = req.param('firstName'); //etc... account.save(function(err, result) { email.sendOne('welcome', {}, function
exports.register_post = function(req, res) {
var account = new Account();
account.firstName = req.param('firstName');
//etc...
account.save(function(err, result) {
email.sendOne('welcome', {}, function(err) {
res.render('account/register', {
title: 'Register'
});
});
});
};
describe('POST /account/register', function(done) {
var email;
beforeEach(function(done) {
accountToPost = {
firstName: 'Alex',
};
email = require('../../app/helpers/email');
sinon.stub(email)
done();
});
afterEach(function(done) {
email.sendOne.restore();
done();
})
it('creates account', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
//todo: asserts
done();
});
});
it('sends welcome email', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
sinon.assert.calledWith(email.sendOne, 'welcome');
done();
});
});
});
我有一个测试,我有电子邮件存根
email
是路由中的模块Irequire
。
它具有如下功能:
exports = module.exports.sendOne = function(templateName, locals, cb)
我的测试如下所示:
exports.register_post = function(req, res) {
var account = new Account();
account.firstName = req.param('firstName');
//etc...
account.save(function(err, result) {
email.sendOne('welcome', {}, function(err) {
res.render('account/register', {
title: 'Register'
});
});
});
};
describe('POST /account/register', function(done) {
var email;
beforeEach(function(done) {
accountToPost = {
firstName: 'Alex',
};
email = require('../../app/helpers/email');
sinon.stub(email)
done();
});
afterEach(function(done) {
email.sendOne.restore();
done();
})
it('creates account', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
//todo: asserts
done();
});
});
it('sends welcome email', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
sinon.assert.calledWith(email.sendOne, 'welcome');
done();
});
});
});
当我运行测试时,两个都失败,引用:
1) 控制员。账户过账/账户/登记创建账户:
错误:超过2000毫秒的超时时间
在空。(/usr/local/lib/node_modules/mocha/lib/runnable.js:165:14)
at Timer.listOnTimeout[as onttimeout](timers.js:110:15)
2) 控制员。账户张贴/账户/注册发送欢迎电子邮件:
错误:超过2000毫秒的超时时间
在空。(/usr/local/lib/node_modules/mocha/lib/runnable.js:165:14)
at Timer.listOnTimeout[as onttimeout](timers.js:110:15)
如果我在路由中注释掉email.sendOne('welcome',{},function(err){
,那么第一个测试(创建帐户)通过
设置sinon存根时,我是否遗漏了一些内容?sinon存根不会自动启动任何回调函数,您需要手动执行此操作。但实际上需要执行以下操作:
describe('POST /account/register', function(done) {
var email;
beforeEach(function(done) {
accountToPost = {
firstName: 'Alex',
};
email = require('../../app/helpers/email');
sinon.stub(email);
email.sendOne.callsArg(2);
done();
});
afterEach(function(done) {
email.sendOne.restore();
done();
})
it('creates account', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
//todo: asserts
done();
});
});
it('sends welcome email', function(done) {
request(app)
.post('/account/register')
.send(this.accountToPost)
.expect(200)
.end(function(err, res) {
should.not.exist(err)
sinon.assert.calledWith(email.sendOne, 'welcome');
done();
});
});
});
请注意具体的一行:
email.sendOne.callsArg(2);
关于callsArg和callsArgWith(这可能对您测试错误场景有用)Spot-on!也非常有意义!谢谢!