【问题标题】:How to test node.js module which returns anonymous function?如何测试返回匿名函数的node.js模块?
【发布时间】: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();
   }
};

,在单元测试期间,我想测试是否调用了方法 searchByMarkersearchByQuerystring

所以我开始写这个测试,

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


【解决方案1】:

好的,

所以发表这篇文章可以帮助我找到解决方案。我重写了我的中间件入口点,看起来像这样

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

所以方法 searchByMarkersearchByQuerystring 已经消失并被方法 searchRequestParser 替换为输出,然后我在代码中处理这个输出out 之前在方法 searchByMarkersearchByQuerystring 中重复。

感谢我使用的函数的返回输出,我不必专注于模拟/存根这些函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多