监视在测试执行过程中动态创建的对象的方法

时间:2019-07-11 13:01:33

标签: javascript jasmine jasmine2.0

我需要spyOn另一个方法内部动态创建的对象的方法

因此请考虑以下事项:

public doStuff = () => {
    const myThing = new MyThing();
    myThing.doSomethingElse().then((data) => {
        //do more stuff here...
    })
}

因此,我想侦听MyThing实例和对doSomethingElse()的调用。

我确实遇到了一个解决方案here,该解决方案利用了对象的prototype,我曾这样尝试过

spyOn(MyThing.prototype, 'doSomethingElse').and.returnValue(Promise.resolve({foo: 'bar'}));

但是当我在测试中调用doStuff()后,此操作不起作用,我得到了一个错误:

  

错误:: doSomethingElse()方法不存在

但是我知道这种方法很好,因为它可以在本地按预期运行。

我不确定该如何进行,有人可以协助吗? 谢谢

2 个答案:

答案 0 :(得分:0)

您的考试中可能遗漏了一些东西。这是一个简单的测试,您可以看到它按预期运行

require("jasmine");

class MyThing {
  async doSomethingElse() {
    return { bar: "foo" };
  }
}

class Stuff {
  doStuff() {
    const myThing = new MyThing();
    myThing.doSomethingElse().then(data => {
      console.log(data);
    });
  }
}

describe("doSomethingElse", () => {
  it("toHaveBeenCalled", () => {
    spyOn(MyThing.prototype, "doSomethingElse").and.returnValue(
      Promise.resolve({ foo: "bar123" })
    );

    const stuff = new Stuff();
    stuff.doStuff();

    expect(MyThing.prototype.doSomethingElse).toHaveBeenCalled();
  });
});

关键是在实例化包含spyOn函数的类之前使用doStuff。如果将const stuff = new Stuff();移到spyOn上方,则会失败。

希望有帮助

答案 1 :(得分:0)

您可以通过传入一个对象(其中属性名称表示方法返回的数据)来使用模拟方法创建间谍对象。

describe('test', () => {
  let mock;
  beforeEach(() => {
    mock = jasmine.createSpyObj('mock', {
      doSomethingElse: Promise.resolve({foo: 'bar'})
    });
  });
  
  it('call mock', async () => {
    const result = await mock.doSomethingElse();
    expect(result.foo).toEqual('bar');
  });
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine-html.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/boot.js"></script>