18

给定以下代码片段,您将如何创建一个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方法。有什么建议么?

4

2 回答 2

24

或者,正如 Gregg 暗示的那样,我们可以使用“原型”。也就是说,我们可以不直接监视 MyCoolObject,而是监视 MyCoolObject.prototype。

describe("MyFunction", function () {
    it("calls doSomething", function () {
        spyOn(MyCoolObject.prototype, "doSomething");
        MyFunction();
        expect(MyCoolObject.prototype.doSomething).toHaveBeenCalled();

    });
});
于 2015-08-07T05:17:07.257 回答
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();
});
于 2014-03-10T03:52:41.237 回答