【问题标题】:Mocking dependency in Node (mainly for unit testing)在 Node 中模拟依赖(主要用于单元测试)
【发布时间】:2015-07-14 14:34:07
【问题描述】:

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

文件结构:

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

以此类推。


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

最有可能在测试文件中模拟几次并在测试文件中的所有测试结束后重置 a。

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


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

我遇到了以下模块

few others


在上面,看起来mockery 解决了我的用例,主要是reset/un-mock the mocked dependency

如何在proxyquire中实现同样的效果?


是否有任何其他模块可以解决所述用例?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 2016-02-19
      • 2017-09-25
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2013-07-07
      • 2015-12-18
      相关资源
      最近更新 更多