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();

    });
});

非常感谢格雷格!