鉴于以下代码段,您如何创建Jasmine spyOn
测试以确认在运行doSomething
时调用MyFunction
?
function MyFunction() {
var foo = new MyCoolObject();
foo.doSomething();
};
这是我的测试的样子。不幸的是,在评估spyOn
调用时出现错误:
describe("MyFunction", function () {
it("calls doSomething", function () {
spyOn(MyCoolObject, "doSomething");
MyFunction();
expect(MyCoolObject.doSomething).toHaveBeenCalled();
});
});
Jasmine似乎没有在那时识别doSomething
方法。有什么建议吗?
答案 0 :(得分:18)
或者,正如Gregg暗示的那样,我们可以使用'原型'。也就是说,我们可以监视MyCoolObject.prototype,而不是直接监视MyCoolObject。
describe("MyFunction", function () {
it("calls doSomething", function () {
spyOn(MyCoolObject.prototype, "doSomething");
MyFunction();
expect(MyCoolObject.prototype.doSomething).toHaveBeenCalled();
});
});
答案 1 :(得分:17)
当你调用new MyCoolObject()
时,你调用MyCoolObject
函数并获得一个带有相关原型的新对象。这意味着当您spyOn(MyCoolObject, "doSomething")
时,您没有在new
调用返回的对象上设置间谍,而是在doSomething
函数本身的MyCoolObject
函数上设置间谍
您应该可以执行以下操作:
it("calls doSomething", function() {
var originalConstructor = MyCoolObject,
spiedObj;
spyOn(window, 'MyCoolObject').and.callFake(function() {
spiedObj = new originalConstructor();
spyOn(spiedObj, 'doSomething');
return spiedObj;
});
MyFunction();
expect(spiedObj.doSomething).toHaveBeenCalled();
});