24

我正在尝试在构造函数上创建一个间谍,看看它是否被调用——下面是我的测试。我使用的是 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');
});
4

3 回答 3

10

问题是Sinon 不知道要监视什么引用,因此解决方案是使用对象iesinon.spy(namespace, 'foo')或自己覆盖引用foo = sinon.spy(foo)

于 2013-02-12T17:48:26.860 回答
10

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

var temp = new FunctionName();

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

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

expect(jamesBond.called).to.be.equal(true);
于 2015-06-23T08:10:34.627 回答
0

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

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

const moment = new Date();
chai.spy.on(global, 'Date', () => moment);
于 2018-04-17T15:19:54.910 回答