javascript - 如何 sinon spy 模块导出实用函数

标签 javascript node.js sinon chai

在 javascript (ES6) 中,我有一个只包含一些函数的实用程序模块,然后在文件末尾,我像这样导出它们:

module.exports = {
  someFunction1,
  someFunction2,
  someFunction3,
}

然后我想为那些功能编写单元测试。一些功能相互依赖;它们以某种方式相互调用,例如,someFunction1 可能会调用 someFunction2。没有循环问题。

一切正常,直到我需要监视调用了其中一个函数。我该怎么做?目前我正在使用 Chai 和 Sinon。

在测试文件中,我将整个文件作为一个模块导入:

const wholeModule = require('path/to/the/js/file')

最后,我的测试如下所示:

it('should call the someFunction2', (done) => {
  const spy = sinon.spy(wholeModule, 'someFunction2')

  wholeModule.someFunction1() // someFunction2 is called inside someFunction1

  assert(spy.calledOnce, 'someFunction2 should be called once')
  done()
})

问题是,测试失败,因为在 someFunction1 中,直接使用了 someFunction2 函数。我将 spy 应用到模块对象的函数中。但那是不同的对象。这是 someFunction1 的示例:

function someFunction1() {
  someFunction2()
  return 2;
}

我知道它不起作用的原因,但我不知道在这种情况下让它起作用的最佳做法是什么?请帮忙!

最佳答案

您可以使用 rewire模块。这是一个例子:

源代码:

function someFunction1() {
  console.log('someFunction1 called')
  someFunction2();
}

function someFunction2() {
  console.log('someFunction2 called')
}

module.exports = {
  someFunction1: someFunction1,
  someFunction2: someFunction2
}

测试用例:

'use strict';

var expect = require('chai').expect;
var rewire = require('rewire');
var sinon = require('sinon');

var funcs = rewire('../lib/someFunctions');

it('should call the someFunction2', () => {
  var someFunction2Stub = sinon.stub();
  funcs.__set__({
    someFunction2: someFunction2Stub,
  });

  someFunction2Stub.returns(null);

  funcs.someFunction1();

  expect(someFunction2Stub.calledOnce).to.equal(true);
});

关于javascript - 如何 sinon spy 模块导出实用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39868119/

相关文章:

javascript - 模拟 sinon 中的当前时间

javascript - 如何检查方法是否在 spy 中被调用?

javascript - Sinon.js、QUnit 和 Jquery。尝试通过 FakeXMLHttpRequest 验证发布的数据

javascript - 隔离范围 - 仅在指令范围内定义的值必须执行更改

javascript - 快速 HTML 表格排序?

javascript - 使用 babel 连接文件

javascript - Socket.io 聊天服务器不提供 SSL 证书

javascript - 使用回调在不同时间为同一元素设置动画

c# - 如何关闭当前浏览器窗口并重定向到同一浏览器先前打开的窗口

javascript - selenium 找不到 chromedriver