Jest макет класса экземпляр класса и функции в классе - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть класс, который я тестирую, давайте назовем его ToTest.ts, он создает экземпляр и экземпляр другого класса, Irrelevant.ts, и вызывает для него метод с именем doSomething.

// ToTest.ts
const irrelevant = new Irrelevant();
export default class ToTest {

  // ... some implementation, constructor, etc.

  public static callIrrelevant() {
    return irrelevant.doSomething();
  }
}

//Irrelevant.ts
export default class Irrelevant {

  // ... some implementation, constructor, etc.

  public doSomething() {
    console.log("doing something");
  }
}

Как я могу издеваться над irrelevant.doSomething() в моем шутливом тесте?

Я пробовал:

import Irrelevant from '../some/path/irrelevant';
test('irrelevant.doSomething is mocked' => {
  Irrelevant.prototype.doSomething = () => jest.fn().mockImplementation(() => {
    console.log(`function got called`)
  });
  const toTest = new ToTest();
  toTest.callIrrelevant();
});
test('irrelevant.doSomething is mocked -- second try' => {
  jest.mock('../some/path/irrelevant')
  const mockDoSomething = jest.spyOn(Irrelevant, "doSomething"); // Gives error: Argument of type '"doSomething"' is not assignable to parameter of type 'never'.
  findMock.mockImplementation(() => {
    console.log(`function got called`)
  });
  const toTest = new ToTest();
  toTest.callIrrelevant();
 });
});

Реализации имитации не запускаются ни в одном тесте. Как я могу издеваться над этим правильно?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020
import Irrelevant from '../some/path/irrelevant';
test('irrelevant.doSomething is mocked' => {
  Irrelevant.prototype.doSomething = () => jest.fn(() => {
    console.log(`function got called`)
  });
  const toTest = new ToTest();
  toTest.callIrrelevant();
});
0 голосов
/ 01 апреля 2020

Вы должны рассматривать mockImplementation как макет конструктора Irrelevant. То, что он вернёт, будет твоей насмешкой. Так что вы можете сделать так:

import Irrelevant from '../some/path/irrelevant';

jest.mock('../some/path/irrelevant')

const spyDoSomething = jest.fn();

(Irrelevant as any).mockImplementation(() => {
  return { doSomething: spyDoSomething };
})
...