sinon间谍独立功能

时间:2015-08-31 22:58:57

标签: sinon

当我在对象内部的函数上使用Sinon时,它可以工作:

function myFunc() {
    console.log('hello');
}
var myObj = { myFunc: myFunc };
var spy = sinon.stub(myFunc);
myObj.myFunc();
expect(spy.called).to.be.true(); 

但是,我不知道为什么当我在一个独立的函数上使用Sinon时如下:

function myFunc() {
    console.log('hello');
}
var spy = sinon.stub(myFunc);
myFunc();
expect(spy.called).to.be.true(); 

断言失败。

3 个答案:

答案 0 :(得分:13)

你在正确的道路上有点但是偏离了。让我们一起努力,让事情正确:

// ...
function myFunc() {
    console.log( 'hello' );
}
var spiedMyFunc = sinon.spy( myFunc ); // what you want is a 'spy' not a 'stub'
// ...

然后此时spiedMyFunc包裹myFunc。因此,调用spiedMyFunc()主要应该 等于 与调用myFunc()相同的结果。同时spiedMyFunc另外

  

记录所有参数,此值,异常和返回值   调用

所以代码片段的其余部分应如下所示:

// myFunc(); // no you should be calling spiedMyFunc() instead
spiedMyFunc();
expect( spiedMyFunc.called ).to.be.true();

这就是你如何监视独立功能。但是,存储独立函数并不具有概念意义。

在对此答案的评论中回答@charlesdeb的问题:

调用方法时,它可以触发隐式调用其他方法的链。由于这种隐式或间接调用,您可能希望控制链中其他方法的行为,而研究特定方法的行为。 * Stubbing * 是实现所述控制的手段。

使用函数时,实际遵循功能范例以使事情变得简单可靠是有益的。考虑一下:

function a () { ... }

function b () { a(); }

在测试b时,有必要并且足以证明b()的执行依次执行a()。但是,通过实施b的方式,无法验证是否已调用a

但是,如果我们应用功能范例,那么我们应该

function a () { ... }

function b ( a ) { a(); }

因此,我们可以编写如下的简单测试:

var a_spy = sinon.spy( a );

var actualOutcomeOfCallingB = b( a_spy );

expect( a_spy.called ).to.be.true;
expect( actualOutcomeOfCallingB ).to.equal( expectedOutcome );

如果你想存根 a,那么不要使用真正的a创建一个间谍,而不是使用你喜欢的存根。

var a_stub = sinon.spy( function () { /* behaves differently than the actual `a` */ }  ); // that's your stub right there!

var actualOutcomeOfCallingB = b( a_stub );

expect( a_stub.called ).to.be.true;
expect( actualOutcomeOfCallingB ).to.equal( expectedOutcome );

答案 1 :(得分:1)

我不确定浏览器端是否有解决方案。

但是如果你在node.js环境中运行它,你可以导出该函数并在另一个文件中测试它。

例如,您的源文件为library(reshaep2) as.matrix(melt(things)[2:1]) ,测试文件为source.js

在source.js

test.js

在test.js

function myFunc() {
    console.log('hello');
}
module.exports.myFunc = myFunc;

希望这可以帮到你。

答案 2 :(得分:-1)

你的第一个例子不起作用。目前无法从独立功能创建存根。你可以使用stub对象的方法:

var stub = sinon.stub(myObj, 'myFunc');

但是如果你想监视方法或函数,你应该创建一个spy(而不是stub):

间谍方法:

var spy = sinon.spy(myObj, 'myFunc');
myObj.myFunc(); // or spy();
expect(spy.called).to.be.true(); 

监视独立功能:

var spy = sinon.spy(myFunc); // returns spied function
spy();
expect(spyFunc.called).to.be.true();

请注意sinon.spy(myFunc)不修改原始函数,只返回间谍。