【问题标题】:How to use Jasmine spies on an object created inside another method?如何在另一个方法中创建的对象上使用 Jasmine 间谍?
【发布时间】:2014-03-10 03:00:06
【问题描述】:

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

【问题讨论】:

    标签: javascript testing jasmine spy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      当您调用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();
      });
      

      【讨论】:

      • 非常感谢格雷格!
      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2020-04-26
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多