Nest JS - Написание проблемы Jest Test Case для функции, возвращающей наблюдаемый ответ Axios - PullRequest
1 голос
/ 16 марта 2019

Я довольно новичок в техническом стеке NestJS + Typescript + RxJs. Я пытаюсь написать пример модульного теста, используя Jest для одной из моих функций, но не уверен, что делаю это правильно.

component.service.ts

public fetchComponents(queryParams) {
  const url = this.prepareUrl(queryParams);

  const data$ = this.httpService.get(url);

  return data$
    .pipe(map(({ data }) => data));
}

component.sevice.spec.ts

Тестовый кейс работает и проходит

describe('fetchComponents', () => {
  const query = {
    limit: 10,
    offset: 0
  };

  const result: AxiosResponse = {
    data: 'Components',
    status: 200,
    statusText: 'OK',
    headers: {},
    config: {}
  };
  it('should return Dummy Data when called successfully', () => {
    componentService.prepareUrl = jest.fn();

    jest.spyOn(httpService, 'get').mockImplementation(() => of(result));

   componentService.fetchComponents(market, query)
    .subscribe(
      (res) => {
        expect(res).toEqual('Components');
      }
    );
  });
});

Не могли бы вы предоставить предложения и указания о том, как именно я должен проверить эту функцию. Также без использования библиотеки, как marbel-rx Я не уверен, что я проверяю это правильно. Есть ли что-то еще, что я должен проверить?

1 Ответ

0 голосов
/ 18 марта 2019

Поскольку Observables являются асинхронными, вам нужно вызвать добавить асинхронный параметр done и вызвать done() после expect, который выполняется последним. В противном случае jest завершит выполнение теста после вызова subscribe(), не ожидая выполнения асинхронного выполнения обратного вызова subscribe. Попробуйте сделать ваш тест неудачным, например, ожидая 'Komponents'. Тест не пройдёт.

Кроме того, я бы рекомендовал использовать mockImplementationOnce вместо mockImplementation, когда это возможно, чтобы избежать неявного повторного использования имитационного поведения в последующих вызовах и, тем самым, создания неявных зависимостей.

it('should return Dummy Data when called successfully', done => {
// Add done parameter                                   ^^^^
  componentService.prepareUrl = jest.fn();

  jest.spyOn(httpService, 'get').mockImplementationOnce(() => of(result));
// Prefer mockImplementationOnce                   ^^^^

  componentService.fetchComponents(market, query)
    .subscribe(
      (res) => {
        expect(res).toEqual('Components');
        done();
//      ^^^^^^  Call done() when test is finished
      }
    );
});
...