Следите за методом объекта, созданного динамически во время выполнения теста - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно, чтобы метод объекта динамически создавался внутри другого метода

Итак, рассмотрим следующее:

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

Я хочу, следовательно, шпионить за экземпляром MyThing и вызовом doSomethingElse().

Я наткнулся на решение здесь , которое использует объект prototype, который я пытался сделать так

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

Но это не работает после того, как я позвонил doStuff() в моих тестах, я получаю ошибку:

Ошибка: метод doSomethingElse () не существует

Но я знаю, что этот метод хорош, так как он работает, как ожидается, локально.

Я не уверен, как поступить, кто-нибудь может помочь? Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вы можете создать шпионский объект с помощью имитирующего метода, передав объект, в котором имена свойств представляют возвращенные данные для методов.

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>
0 голосов
/ 11 июля 2019

Возможно, вы что-то упустили в своем тесте.Это простой тест, и вы можете видеть, что он работает так, как ожидалось

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, это не получится.

Надеюсь, это поможет

...