Javascript 如何在另一个方法中创建的对象上使用Jasmine spies?
给定以下代码片段,您将如何创建一个Javascript 如何在另一个方法中创建的对象上使用Jasmine spies?,javascript,testing,jasmine,spy,Javascript,Testing,Jasmine,Spy,给定以下代码片段,您将如何创建一个spyOn测试来确认运行MyFunction时调用doSomething function MyFunction() { var foo = new MyCoolObject(); foo.doSomething(); }; 这是我的测试结果。不幸的是,我在计算spyOn调用时出错: describe("MyFunction", function () { it("calls doSomething", function () {
spyOn
测试来确认运行MyFunction
时调用doSomething
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
方法。有什么建议吗?当您调用newmycoloobject()
时,您调用mycoloobject
函数并获得一个具有相关原型的新对象。这意味着当您spyOn(mycoloobject,“doSomething”)
时,您并不是在new
调用返回的对象上设置间谍,而是在mycoloobject
函数本身的一个可能的doSomething
函数上设置间谍
您应该能够执行以下操作:
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();
});
或者,正如格雷格暗示的,我们可以使用“原型”。也就是说,我们可以监视mycoloobject.prototype,而不是直接监视mycoloobject
describe("MyFunction", function () {
it("calls doSomething", function () {
spyOn(MyCoolObject.prototype, "doSomething");
MyFunction();
expect(MyCoolObject.prototype.doSomething).toHaveBeenCalled();
});
});
非常感谢格雷格!