Как сохранить результат асинхронного метода в свойстве класса?

Я пытаюсь получить HTML-код с веб-страницы, используя класс с одним асинхронным методом. Я использую Typescript 3.4.3, запрос-обещание 4.2.4.

import * as rp from 'request-promise';

class HtmlFetcher {

  public uri: string;
  public html: string;

  public constructor(uri: string) {
    this.uri = uri;
  }

  public async fetch() {
    await rp(this.uri).then((html) => {
      this.html = html;
    }).catch((error) => {
      throw new Error('Unable to fetch the HTML page');
    });
  }

}

export { HtmlFetcher };

Я использую следующий код для тестирования своего класса с помощью Jest 24.8.0. Адрес в строке 6 используется с единственной целью тестирования, я также пробовал с другими URI.

import { HtmlFetcher } from './htmlFetcher.service';

describe('Fetch HTML', () => {

  it('should fetch the HTMl at the given link', () => {
    const uri = 'http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm';
    const fetcher = new HtmlFetcher(uri);
    fetcher.fetch();

    expect(fetcher.html).toBeDefined();
  });

});

Я ожидаю, что свойство html будет содержать строку HTML, полученную по заданному адресу после вызова метода fetch (). Однако тестовый код не проходит и регистрирует, что fetcher.html равно undefined. Документы Typescript, Jest и запрос-обещание не помогли. Что я делаю неправильно?


person Community    schedule 03.06.2019    source источник
comment
Вы не ждете завершения fetch() перед проверкой   -  person TKoL    schedule 03.06.2019
comment
Это асинхронная функция, то есть ее результат не будет доступен, если вы не находитесь в .then обещания или не ожидаете его.   -  person TKoL    schedule 03.06.2019
comment
jestjs.io/docs/en/tutorial-async   -  person TKoL    schedule 03.06.2019
comment
Или используйте имитацию таймера Jest jestjs.io/docs/en/timer-mocks   -  person Harijs Deksnis    schedule 03.06.2019


Ответы (1)


Нашел ответ благодаря комментариям TKoL и другому взгляду на документ, который я уже читал 50 раз, а именно: Jest async testing. Надо бы RTFM поосторожнее ...

Тестовый код также должен быть асинхронным.

import { HtmlFetcher } from './htmlFetcher.service';

describe('Fetch HTML', () => {

  it('should fetch the HTMl at the given link', async () => { // Added async keyword
    const uri = 'http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm';
    const fetcher = new HtmlFetcher(uri);
    await fetcher.fetch(); // Added await keyword

    expect(fetcher.html).toBeDefined();
  });

});
person Community    schedule 03.06.2019