首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sinon监视独立函数

sinon监视独立函数
EN

Stack Overflow用户
提问于 2015-09-01 06:58:57
回答 3查看 18.4K关注 0票数 22

当我在对象内部的函数上使用Sinon时,它起作用了:

代码语言:javascript
复制
function myFunc() {
    console.log('hello');
}
var myObj = { myFunc: myFunc };
var spy = sinon.stub(myFunc);
myObj.myFunc();
expect(spy.called).to.be.true(); 

然而,我不知道为什么我在一个独立的函数上使用Sinon,如下所示:

代码语言:javascript
复制
function myFunc() {
    console.log('hello');
}
var spy = sinon.stub(myFunc);
myFunc();
expect(spy.called).to.be.true(); 

断言失败。

EN

回答 3

Stack Overflow用户

发布于 2017-08-24 05:43:34

你是在正确的道路上,但偏离了方向。让我们来看看你所做的努力,并把事情做好:

代码语言:javascript
复制
// ...
function myFunc() {
    console.log( 'hello' );
}
var spiedMyFunc = sinon.spy( myFunc ); // what you want is a 'spy' not a 'stub'
// ...

在这一点上,spiedMyFunc包装了myFunc。因此,调用spiedMyFunc()应该主要是相当于,这与调用myFunc()的结果相同。同时,spiedMyFunc

记录所有调用的参数、该值、异常和返回值。

因此,代码片段的其余部分应该如下所示:

代码语言:javascript
复制
// myFunc(); // no you should be calling spiedMyFunc() instead
spiedMyFunc();
expect( spiedMyFunc.called ).to.be.true();

这就是你如何监视一个独立的函数。但是,在概念上,将独立 function存根是没有意义的。

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

当一个方法被调用时,它可以触发一个隐式调用其他方法的链。由于这种隐式或间接调用,您可能希望在研究特定方法的行为时控制链中的其他方法的行为。短桩是实现上述控制的一种手段。

在使用函数时,实际遵循函数范例使事情变得简单和可靠是有益的。请考虑以下内容:

代码语言:javascript
复制
function a () { ... }

function b () { a(); }

在测试b时,证明b()的执行反过来执行了a()是必要的,也是充分的。但是按照b的实现方式,不可能验证是否调用了a

然而,如果我们应用了函数范式,那么我们应该

代码语言:javascript
复制
function a () { ... }

function b ( a ) { a(); }

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

代码语言:javascript
复制
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创建间谍,而要使用您喜欢的存根。

代码语言:javascript
复制
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 );
票数 20
EN

Stack Overflow用户

发布于 2017-05-27 01:25:31

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

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

例如,源文件是source.js,测试文件是test.js

在source.js中

代码语言:javascript
复制
function myFunc() {
    console.log('hello');
}
module.exports.myFunc = myFunc;

在test.js中

代码语言:javascript
复制
var source = require('./source');
var sinon = require('sinon');
var expect = require('chai').expect;

sinon.stub(source, 'myFunc').returns(true);
source.myFunc();
expect(sinon).to.be.true;

希望这能对你有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-03-19 18:58:43

您的第一个示例不能很好地工作。当前不能从独立函数创建存根。你可以存根对象的方法:

代码语言:javascript
复制
var stub = sinon.stub(myObj, 'myFunc');

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

监视方法:

代码语言:javascript
复制
var spy = sinon.spy(myObj, 'myFunc');
myObj.myFunc(); // or spy();
expect(spy.called).to.be.true(); 

监视单机版功能:

代码语言:javascript
复制
var spy = sinon.spy(myFunc); // returns spied function
spy();
expect(spyFunc.called).to.be.true();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32321149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档