繁体   English   中英

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

[英]How to use Jasmine spies on an object created inside another method?

鉴于以下代码片段,您将如何创建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暗示的那样,我们可以使用'原型'。 也就是说,我们可以监视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函数上设置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();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM