首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sinon监视javascript中的构造函数

使用sinon监视javascript中的构造函数
EN

Stack Overflow用户
提问于 2013-02-11 01:24:21
回答 3查看 17.3K关注 0票数 24

我正在尝试创建一个构造函数上的间谍,看看它是否会被调用--下面是我的测试。我使用sinon-chai,所以语法是有效的,但是两个测试都失败了。

代码语言:javascript
复制
var foo = function(arg) {
};

var bar = function(arg) {
    var baz = new foo(arg);
};

it('foo initialized inside of this test', function() {
    var spy = sinon.spy(foo);
    new foo('test');
    expect(spy).to.be.called;
    expect(spy).to.be.calledWith('test');
});
it('foo initialized by bar()', function() {
    var spy = sinon.spy(foo);
    bar('test');
    expect(spy).to.be.called;
    expect(spy).to.be.calledWith('test');
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-13 01:48:27

问题是Sinon不知道要窥探的引用是什么,所以解决方案是要么使用一个对象,即sinon.spy(namespace, 'foo'),要么覆盖自己的引用foo = sinon.spy(foo)

票数 10
EN

Stack Overflow用户

发布于 2015-06-23 16:10:35

考虑到你的构造函数被绑定到'window‘,这意味着如果你在浏览器上打开开发者控制台,你应该能够通过使用相关的函数/构造函数来整合一个对象,如下所示:

代码语言:javascript
复制
var temp = new FunctionName();

如果是这样的话,实际的工作代码可能是:

代码语言:javascript
复制
var jamesBond = sinon.spy(window, 'FunctionName');
var temp = new FunctionName(args);

expect(jamesBond.called).to.be.equal(true);
票数 10
EN

Stack Overflow用户

发布于 2018-04-17 23:19:55

如果你想在Node上使用它,@stckvflw的答案可以修改,假设你知道构造函数的命名空间,就像@billy提到的那样。对于JS内置类,您可能会正确地假设它们位于global中。

使用chai-spies冻结Date对象的具体示例(相当于使用Sinon创建stub ):

代码语言:javascript
复制
const moment = new Date();
chai.spy.on(global, 'Date', () => moment);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14800428

复制
相关文章

相似问题

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