如何使用Jasmine监视在另一个方法中创建的对象



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

或者,正如Gregg所暗示的,我们可以使用'prototype'。也就是说,我们可以监视MyCoolObject.prototype,而不是直接监视MyCoolObject。

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

当您调用new MyCoolObject()时,您调用MyCoolObject函数并获得具有相关原型的新对象。这意味着,当您执行spyOn(MyCoolObject, "doSomething")时,您不是在new调用返回的对象上设置监视,而是在MyCoolObject函数本身的可能的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();
});

相关内容

  • 没有找到相关文章

最新更新