Sinon 检查对象的其他方法是否被 promise 调用
Sinon check if other method of object is invoked with promise
我有一个令人困惑的不工作测试,我无法以某种方式解决(我来自 Java 背景,所以如果我的术语中有一些错误,我提前道歉)。
有一个对象 class Trigger
,它有一些 public 函数,foo()
和 bar()
。
逻辑是:
可以直接在另一个对象上调用 foo()
,或者如果调用 bar()
(使用 array),则 Trigger.bar()
调用Trigger.foo()
array.length 次。
触发器是用 bluebird Promises 实现的。
这是Trigger的基本摘录(我删除了一些逻辑,这样看起来有点多余,但实际上发生的更多):
// 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
})
});
由于 Trigger 的承诺,这显然不起作用,因此告诉我:
AssertionError: expected foo to have been called at least once, but it was never called
但无论我如何尝试在 bar()
的 then() 块 中解决这个问题,它总是声称我的间谍没有被调用。
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 相同的问题。
我有一个令人困惑的不工作测试,我无法以某种方式解决(我来自 Java 背景,所以如果我的术语中有一些错误,我提前道歉)。
有一个对象 class Trigger
,它有一些 public 函数,foo()
和 bar()
。
逻辑是:
可以直接在另一个对象上调用 foo()
,或者如果调用 bar()
(使用 array),则 Trigger.bar()
调用Trigger.foo()
array.length 次。
触发器是用 bluebird Promises 实现的。 这是Trigger的基本摘录(我删除了一些逻辑,这样看起来有点多余,但实际上发生的更多):
// 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
})
});
由于 Trigger 的承诺,这显然不起作用,因此告诉我:
AssertionError: expected foo to have been called at least once, but it was never called
但无论我如何尝试在 bar()
的 then() 块 中解决这个问题,它总是声称我的间谍没有被调用。
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 相同的问题。