Как сохранить результат асинхронного метода в свойстве класса? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь извлечь 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 и request-обещания не оказали никакой помощи. Что я делаю не так?

1 Ответ

0 голосов
/ 03 июня 2019

Нашел ответ благодаря комментариям TKoL и другому взгляду на документ, который я уже прочитал 50 раз, а именно: Асинхронное тестирование Jest .Я должен был сделать 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();
  });

});
...