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相同的问题。