Как правильно протестировать использование поддельного сервиса, который возвращает Обещание? - PullRequest
0 голосов
/ 26 апреля 2020

Я новичок в Angular и все еще пытаюсь понять, как все это работает. В настоящее время у меня возникают проблемы при тестировании компонента, который зависит от службы, которая возвращает Promise. Функция, которую я тестирую, структурирована следующим образом:

success: boolean;    

borrowBook() {
  this.bookService.borrow(this.selectedBook.id)
    .then(() => {
      this.success = true;
    })
    .catch((error: BorrowingError) => {
      this.success = false;
    });
}

Теперь я не совсем уверен, считается ли что-то подобное приведенному выше кодом идиоматическим c, но именно так я и написал код. В моем модульном тесте я смоделировал bookService, используя функцию jasmine.createSpyObj, и определил заглушку следующим образом:

mockBookService.borrow.and.returnValue(Promise.resolve(testResult));

Однако мой тест не прошел, сказав, что component.success не определен, когда я ожидал, что он быть правдивым Мой тест запрограммирован следующим образом:

it('test', async(() => {
  mockBookService.borrow.and.returnValue(Promise.resolve(testResult));
  //setup pre-conditions here...
  component.borrowBook(();

  expect(component.success).toBeTruthy();
}));

У меня сложилось впечатление, что ожидания проверяются еще до того, как Обещание будет обработано соответствующим образом.

1 Ответ

0 голосов
/ 27 апреля 2020

Я случайно наткнулся на эту статью о тестировании асинхронного кода в Angular, в которой говорится, что функцию flushMicrotasks можно использовать для запуска всех асинхронных c компонентов перед проверкой ожиданий. Это обеспечивается только через поддельную зону, созданную с помощью fakeAsync, поэтому в своем коде я использовал это вместо async.

it('test', fakeAsync(() => { //used fakeAsync instead
  mockBookService.borrow.and.returnValue(Promise.resolve(testResult));
  //setup pre-conditions here...
  component.borrowBook(();

  flushMicrotasks(); //added this before checking expectations
  expect(component.success).toBeTruthy();
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...