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

3

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

文件结构:

.
|____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


当通过./test/foo.js单元测试./lib/foo.js时,我想要模拟./lib/bar.js,这样我只关心./lib/foo.js。一旦./test/foo.js中的测试结束,我想重置/取消模拟./lib/bar.js

当通过./test/bar.js单元测试./lib/bar.js时,我想要模拟./lib/baz.js,这样我只关心./lib/baz.js。一旦./test/foo.js中的测试结束,我想重置/取消模拟./lib/baz.js

同理类推。


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

很可能在测试文件中多次模拟并在测试文件中所有测试结束后重置。

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


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

我找到了以下模块:

还有一些其他的模块,请参考这里


在上述模块中,看起来mockery可以解决我的问题,主要是重置/取消模拟的依赖项

如何在proxyquire中实现相同的功能?


还有其他模块可以解决上述问题吗?

1个回答

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的作者之一 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接