如何testing返回匿名函数的node.js模块?

我正在写express.js路由的小型中间件,但是当我来到unit testing时,我卡住了这个代码,我不知道如何使用摩卡,sinon和chai来正确地testing它。

我的中间件代码有这样的入口点:

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(); } }; 

,并在unit testing期间,我想testing方法searchByMarkersearchByQuerystring被调用。

所以我从写这个testing开始,

 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进程请求,我想testing它,如果searchByQuerystring方法被调用,但我真的不知道该怎么做,也许我只是应该用其他方式编写这段代码,不想使用像proxyquire这样的库 。

也许我的模块做了太多的工作(根据单一责任原则) – 但是整个中间件是用于构buildsearch对象的,我只需要从哪个地方find参数就可以了,所以我认为这是一个好主意把这个逻辑放在中间件的开始 – 我应该有两个中间件?

请任何帮助,对此的build议。

好的,

所以把这篇文章帮我find一个解决scheme。 我重写我的中间件入口点,看起来像这样

 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(); }; 

并testing

  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'); }); 

所以方法searchByMarkersearchByQuerystring都不见了,并用方法searchRequestParserreplace为输出,然后我在代码中处理这个输出,因为它原来在方法searchByMarkersearchByQuerystring中复制

得益于我使用的函数的返回输出,我不必专注于模拟/存储这些函数。