我正在为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这样的库。
也许我的模块做了太多工作(根据单一责任原则) - 但整个中间件是用于构建搜索对象,在开始时我只需要找出参数将来自哪个地方,所以我认为它是一个把这个逻辑放在中间件的启动上是个好主意 - 我应该有两个中间件?
请提供任何帮助,建议。
答案 0 :(得分:0)
好的,
所以把这篇文章帮我找到解决方案。我重写了我的中间件入口点,看起来像这样
const searchRequestParser = require('./search-request-parser');
const search = require('../../../lib/search');
module.exports = (req, res, next) => {
const searchRequest = searchRequestParser(req);
if (searchRequest) {
const searchCriteria = search(searchRequest.resourceToSearch);
req.searchQuery =
searchCriteria.buildQuery(searchRequest.queryParameters);
}
next();
};
并测试
it('Should call search by querystring if querystring is present', () => {
const req = httpMocks.createRequest({
method: 'GET',
params: {
resourceToSearch: 'debts'
},
query: {
value: 1000
}
}),
res = httpMocks.createResponse(),
next = sandbox.spy();
searchIndex(req, res, next);
expect(req).to.have.a.property('searchQuery');
});
所以方法 searchByMarker 或 searchByQuerystring 已经消失,并被方法 searchRequestParser 替换为输出,然后我在代码中处理此输出以前在方法 searchByMarker 或 searchByQuerystring 中重复了。
感谢我使用的函数的返回输出,我没有必要专注于模拟/存根这些函数。