如何在另一个方法中创建的对象上使用Jasmine间谍?

时间:2014-03-10 03:00:07

标签: javascript testing jasmine spy

鉴于以下代码段,您如何创建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方法。有什么建议吗?

2 个答案:

答案 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();
});