任何人都可以告诉我为什么以下测试失败。
var Person = function() {};
Person.prototype.helloSomeone = function(toGreet) {
return this.sayHello() + " " + toGreet;
};
Person.prototype.sayHello = function() {
return "Hello";
};
describe("Person", function() {
it("calls the sayHello() function", function() {
var fakePerson = new Person();
spyOn(fakePerson, "sayHello");
fakePerson.helloSomeone("world");
expect(fakePerson.sayHello).toHaveBeenCalled();
});
});
我是从here拿来的,他说它有效。我可以看到spyOn方法在person对象上创建了一个同名的包装函数,即在对象而不是原型上调用fakePerson.sayHello。
非常感谢
答案 0 :(得分:8)
测试失败,因为我也在使用jasmine-sinon.js。
答案 1 :(得分:4)
您的测试用例可能存在的一个问题是您没有指定应该调用原始方法。具有正确行为的是以下(注意“andCallThrough”):
describe("Person", function() {
it("calls the sayHello() function", function() {
var fakePerson = new Person();
spyOn(fakePerson, "sayHello").andCallThrough();
fakePerson.helloSomeone("world");
expect(fakePerson.sayHello).toHaveBeenCalled();
});
});
您可以查看Jasmine的文档页面,了解有关其他可能性的更多信息:https://github.com/pivotal/jasmine/wiki/Spies
编辑:快速查看jasmine-sinon documentation会显示以下内容:
<强> <击>警告击> 强>
jasmine-sinon目前覆盖了用于其自身间谍功能的任何同名Jasmine匹配器。我打算允许将来保留这些。
被覆盖的原生Jasmine匹配器是:
- <击> toHaveBeenCalled()击>
- <击> toHaveBeenCalledWith()击>
如果你想使用jasmine-sinon,你必须使用他们的API而不是Jasmine。
修改:从Feb 2012开始:
你也可以在你的Sinon间谍旁边使用Jasmine间谍。 jasmine-sinon将检测您正在使用哪个并使用适当的匹配器。