我在尝试为Node.js中的if else语句编写Mocha测试时遇到问题。以下是正在测试的内容:
exports.restrict = function(req, res, next) {
if (req.session.user) {
next();
} else {
req.session.error = 'Access denied!';
res.redirect('/login');
}
}
这就是我试图测试它的方式:
describe('interface', function(){
it('should show ability to asynchronously deny a user with an incorrect password', function(done){
function restrict (req, res, next){
if (req.session.user) {
next();
done();
} else {
req.session.error.should.equals('Access denied');
req.redirect.should.equals('/login');
done();
}
}
});
});
运行测试时收到的错误是它超时,因为它超过2000毫秒。我做错了什么?
答案 0 :(得分:1)
在测试中,您定义了一个永远不会被调用的restrict
函数,因此永远不会调用done
并且测试会超时。这就是你做错了。在Mocha测试中使用if... else
没什么特别的。
更广泛的问题:您在问题中显示的内容表明您将模块的代码复制到测试套件中。这是测试代码的可怕方法。您应该构建模块,以便测试套件能够在不重复代码的情况下运行其功能。
答案 1 :(得分:1)
是的,测试文件中的语句不正确。阅读您的源文件,我们有两种方案来检查restrict
函数。
next()
redirect()
并分配了req.session.error
基于最前面的项目符号,我们可以设计测试,例如
const sinon = require('sinon');
const chai = require('chai');
const assert = chai.assert;
const src = require('./src');
describe('interface', function () {
it('calls next() if user session exist', function () {
const next = sinon.spy();
const res = sinon.spy();
const req = {
session: {
user: 'username' // set user session
}
}
src.restrict(req, res, next);
assert(next.called);
});
it('redirects if user session not exist', function () {
const next = sinon.spy();
const res = {
redirect: sinon.spy()
}
const req = {
session: {}
}
src.restrict(req, res, next);
assert.equal(req.session.error, 'Access denied!');
assert(res.redirect.calledWith('/login'));
assert.isFalse(next.called)
});
});
我们不需要使用done()
,因为restrict()
不是异步函数。
我们还在此处使用sinon
监视req
,res
和next
变量。
参考: -https://sinonjs.org/
希望有帮助。