模拟Node中的依赖(主要用于单元测试)

时间:2015-05-05 02:09:41

标签: node.js unit-testing dependency-injection mocking

在提出问题之前搜索了一段时间。

文件结构:

.
|____lib
| |____bar.js
| |____baz.js
| |____foo.js
|____test
| |____bar.js
| |____baz.js
| |____foo.js

用例:

对于上述文件结构,./lib/foo.js需要./lib/bar.js./lib/bar.js需要./lib/baz.js

通过./lib/foo.js进行单元测试./test/foo.js,我想模仿./lib/bar.js,因此,我只关注./lib/foo.js。 一旦./test/foo.js中的测试结束,我想重置/取消模拟./lib/bar.js

通过./lib/bar.js进行单元测试./test/bar.js,我想模仿./lib/baz.js,因此,我只关注./lib/baz.js。 一旦./test/foo.js中的测试结束,我想重置/取消模拟./lib/baz.js

等等。

或者换句话说,我想在测试文件中模拟依赖项并在需要时重置。

很可能在测试文件中多次嘲笑并且在测试文件中重新进行重新测试。

或者可能是我可以使用一些文件级别的闭包变量来控制本地模拟

下面提到的StackOverflow帖子有很好的讨论,但我无法得出任何结论。

我遇到了以下模块

few others

在上述内容中,mockery看起来像我的用例,主要是reset/un-mock the mocked dependency

如何在proxyquire中实现相同目标?

是否还有其他模块可以解决上述用例?

1 个答案:

答案 0 :(得分:2)

我使用deriderewire的组合。

例如,为了测试foo.js,我会:

var rewire = require('rewire');
var deride = require('deride');
var Foo = rewire('../lib/foo');
var mockBar, foo;

describe('something', function() {
  beforeEach(function() {
      mockBar = deride.stub(['barMethod']);
      mockBar.setup.barMethod.when('bob').toReturn('Hello bob');
      Foo.__set__('bar', mockBar);
      foo = new Foo();
  });

  it('does something', function() {
    foo.someMethod('bob');
    mockBar.expect.barMethod.called.withArgs(['bob']);
  });
});

并且没有任何不必要的要求。

  

免责声明:我是deride的作者之一:)