【发布时间】:2017-11-09 08:44:12
【问题描述】:
我正在为 express.js 路由编写小型中间件,但是当我对这段代码进行单元测试时,我卡住了,我不知道如何使用 mocha、sinon 和 chai 正确测试它。
我的中间件代码的入口点是这样的:
const searchByQuerystring = require('./search-by-querystring');
const searchByMarker = require('./search-by-marker');
module.exports = (req, res, next) => {
if (req.marker) {
searchByMarker(req, res, next);
} else if (req.query) {
searchByQuerystring(req, res, next);
} else {
next();
}
};
,在单元测试期间,我想测试是否调用了方法 searchByMarker 或 searchByQuerystring。
所以我开始写这个测试,
it('Should call search by querystring if querystring is present', () => {
const req = httpMocks.createRequest({
query: {
value: 1000
}
}),
res = httpMocks.createResponse(),
next = sandbox.spy();
searchIndex(req, res, next);
sinon.assert.calledOnce(next);
});
我的中间件应该在哪里使用 searchByQuerystring 来处理请求,我想测试一下是否调用了 searchByQuerystring 方法,但我真的不知道该怎么做,也许我只是应该以其他方式编写这段代码,我真的不想使用像proxyquire 这样的库。
也许我的模块做了太多的工作(根据单一职责原则) - 但整个中间件是用于构建搜索对象,在开始时我只需要找出参数来自哪个位置,所以我认为这是一个把这个逻辑放在中间件的开始是个好主意——我应该有两个中间件?
请提供任何帮助和建议。
【问题讨论】:
-
除非您尝试测试的函数可以以一种或另一种方式访问,或者您可以根据输出验证调用了哪个函数,否则最好的选择可能是依赖于代码覆盖率工具,例如
istanbul. -
感谢@mscdex 的建议!
标签: javascript node.js unit-testing express