Как использовать jest для макета приватной переменной - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь написать модульный тест для функции, подобной этой:

export class newClass {
    private service: ServiceToMock;

    constructor () {
    this.service = new ServiceToMock()
    }

    callToTest () {
        this.service.externalCall().then(()=> {
        //Code to test
        })
    }
}

Чтобы протестировать этот кусок кода, мне нужно смоделировать сервис, потому что он вызывает функцию вне класса, нопроблема в том, что это личное.

Как именно я делаю макет приватной переменной с помощью jest? Класс создает свой собственный экземпляр этого, так что, возможно, даже смоделировать?

1 Ответ

0 голосов
/ 28 октября 2019

В вашей реализации вы либо импортируете сервис

implementation.js
import ServiceToMock from './serviceToMock.js';
implementation.spec.js
// import the already mocked service
import ServiceToMock from './serviceToMock.js';
import newClass from './implementation';

// auto-mock the service
jest.mock('./serviceToMock.js');

describe('newClass', () => {
  describe('somMethod', () => {
    beforeAll(() => {
      // it is recommended to make sure
      // the previous calls are cleared
      // before writing assertions
      ServiceToMock.prototype.externalCall.mockClear()

      // jest's auto-mocking will create jest.fn()
      // for each of the service's methods
      // and you will be able to use methods like .mockResolvedValue
      // to modify the mock behavior
      ServiceToMock.prototype.externalCall.mockResolvedValue(data);

      // call your method
      (new newClass).someMethod();
    });

    it('should call ServiceToMock.externalCall', () => {
      // and you can write assertions for the mocked methods
      expect(ServiceToMock.prototype.externalCall).toHaveBeenCalledWith();
    });
  });
});

рабочий пример без типов

Или иметь реализацию в файле

В этом случае вам придется протестировать оба класса, так как это ваш модуль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...