javascript - 如何测试返回匿名函数的node.js模块?

标签 javascript node.js unit-testing express

我正在为 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 这样的库.

也许我的模块做了太多工作(根据单一职责原则)——但整个中间件是用于构建搜索对象的,在开始时我只需要找出参数从哪里来,所以我认为这是一个把这个逻辑放在中间件的开始是个好主意——我只应该有两个中间件?

请提供任何帮助和建议。

最佳答案

好的,

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

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 中重复。

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

关于javascript - 如何测试返回匿名函数的node.js模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422087/

相关文章:

unit-testing - 如何在测试中设置由构造函数填充的私有(private)字段?

python - 为什么 unittest.Test Cases 看不到我的 pytest fixtures?

javascript - 在 Javascript 中可以删除特权吗?

javascript - dhtmlxGrid 如何选取值进行排序?

javascript - 变量在方法之外不起作用

javascript - 这个例子中Node的执行顺序是什么

angularjs - 如何在指令中对 $emit 进行单元测试?

javascript - Fire bug/Chrome 控制台手动调用函数

javascript - react native : how can I extend this timer through an alert?

node.js - 如何在node.js + Express.js + mongodb应用程序上异步启动mocha测试