Sinon检查是否有其他方法的对象被承诺调用

问题描述:

我有一个令人困惑的不工作测试,我无法解决某些问题(我来自Java背景,所以如果我的术语中有一些错误,我很抱歉) 。Sinon检查是否有其他方法的对象被承诺调用

有一个对象类Trigger它有一些公共职能,foo()bar()。 的逻辑是:

一个可以直接调用foo()在另一物体上,或者如果bar()被调用(与阵列),然后调用Trigger.bar()Trigger.foo()array.length倍。

触发器是用蓝鸟诺言实现的。 这是触发的基本摘录(我删除了一些逻辑,与这一点,似乎有点多余,但更在现实中有发生):

// Will be refactored afterwards 
var self; 

var Trigger = function() { 
    self = this; 
}; 

Trigger.prototype.bar = function bar(members) { 
    return new Promise(function (resolve, reject) { 
    Promise.map(members, function (member) { 
    self.foo(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
    }); 
}; 

Trigger.prototype.foo = function foo(member) { 
    return new Promise(function(resolve, reject){ 
    doSomethingWithMember(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
} 

所以我们可以看到,每个成员在bar()电话foo()在成员数组中。

我想写一个测试,其中我窥探了触发对象并检查它是否调用foo() n次。

所以,我目前没有(具有函数名),其中我只是检查,如果它甚至被称为:

var chai = require('chai'); 
var expect = chai.expect; 
var sinon = require('sinon'); 
var sinonChai = require('sinon-chai'); 

chai.use(require('chai-as-promised')); 
chai.use(sinonChai); 

var Trigger = require(...); 
var trigger = new Trigger(); 

     ... 

    describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member); 
     return expect(spy).to.have.been.called; // does not pass 
    }) 
    }); 

这显然不因触发的承诺工作,从而告诉我:

AssertionError: expected foo to have been called at least once, but it was never called

但无论我如何努力在解决这一则()块的bar(),它总是声称我的间谍没有被调用。

describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function(){ 
      return expect(spy).to.have.been.called; // does not pass with the same AssertionError (has not been invoked) 
     }); 
    }) 

我已经做了一些日志记录,并确定foo()被调用。任何想法我做错了什么?

问候,

vegaaaa

我发现我的(愚蠢的!)的错误。误读API ...

var spy = sinon.spy(trigger.foo);

应该成为

var spy = sinon.spy(trigger, "foo");

所以这就像一个魅力:

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
    var spy = sinon.spy(trigger, "foo"); 
    var member = MemberBuilder.buildCorrect(); 
    trigger.bar(member) 
    .then(function(res) { 
     return expect(spy).to.have.been.called; 
    }) 
    }) 

或者(因为我发现它更容易理解):

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
     sinon.spy(trigger, "foo"); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function() { 
     return expect(trigger.foo).to.have.been.called; 
     }) 
    }) 

希望这有助于其他人遇到与api相同的问题。