用sinon监视javascript中的构造函数

时间:2013-02-10 17:24:21

标签: javascript mocha sinon

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

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');
});

3 个答案:

答案 0 :(得分:7)

考虑到你的构造函数绑定到'window',这意味着如果你在浏览器上打开开发人员控制台,你应该能够通过使用相关的函数/构造函数来实例化对象:

var temp = new FunctionName();

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

var jamesBond = sinon.spy(window, 'FunctionName');
var temp = new FunctionName(args);

expect(jamesBond.called).to.be.equal(true);

答案 1 :(得分:6)

问题在于Sinon不知道对间谍的引用是什么,因此解决方案是使用对象即sinon.spy(namespace, 'foo')或自己覆盖引用foo = sinon.spy(foo)

答案 2 :(得分:0)

如果你想在Node上使用它,假设你知道@billy提到的构造函数的命名空间,可以调整@stckvflw的答案。对于JS内置类,您可能会认为它们位于global

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

const moment = new Date();
chai.spy.on(global, 'Date', () => moment);