使用 SinonJS 存根(重新布线)

Sam*_*apa 4 javascript testing stub node.js sinon

我有一个功能:

var publish = function(a, b, c) {
    main = a + getWriterName(b,c);
}
Run Code Online (Sandbox Code Playgroud)

getWriterName 是另一个函数:

var getWriterName = function(b,c) {
    return 'Hello World';
}
Run Code Online (Sandbox Code Playgroud)

我想测试“发布”功能,但我不想在测试“发布”时运行“getWriterName”功能。我觉得我存根了 getWriterName 函数,因为我不想每次测试“发布”时都运行它,但是我该怎么做?我做了类似的事情:

var sandbox = sinon.sandbox.create();
sandbox.stub(getWriterName).returns('done');
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误

类型错误:试图将未定义的未定义属性包装为函数

如果我在写路径中,我的存根有什么问题?

编辑:我正在使用重新布线所以想要使用重新布线的解决方案

Sté*_*ert 8

这就是 Sinon 可以与 Rewire 一起使用来存根函数的方式。如果存根函数是私有的,则在这种情况下重新连接特别有用。

it('getWriteName always returns "Hello World"', function() {      
    var stub = sandbox.stub();
    stub.returns('Hello World');
    var unset = log.__set__('getWriterName', stub);

    // your test and expectations here

    unset();
    // it's always good to restore the previous state
});
Run Code Online (Sandbox Code Playgroud)


Sam*_*apa 2

这解决了我的问题:

如果我的函数位于名为main.jsthen 的文件中,首先我会将文件重新连接为:

var main = rewire('main');
Run Code Online (Sandbox Code Playgroud)

然后,要对一个函数中调用的任何其他函数进行存根,就我而言,当我必须存根时,getWriterName我会这样做:

main.__set__('getWriterName', function(b, c) {
    return 'Something Else'
}
Run Code Online (Sandbox Code Playgroud)

最后使用完后,执行以下操作:

main.restore();
Run Code Online (Sandbox Code Playgroud)