Jest Js не ожидает асинхронного вызова / ожидания вызова - PullRequest
1 голос
/ 14 марта 2020

У меня есть следующий класс:

import * as request from "request-promise-native";
export class publisher {

  publish(file : string) : PublisherResponse{

     let response = PublisherResponse.EmptyResponse;
     let options = {};
     let promise = this.executeRequest(file , options);
     promise.then( value =>  response = value );

     return response;
  }

  async executeRequest(file : string, options : any ) : Promise<PublisherResponse>{
     let promise = await request.get("http://someAPI", options);
     console.debug("we need to wait for this thing to finish ...")
     let response = await promise; 
     let data = response.data;

    return new new PublisherResponse(file, data);

 }
}

Тест Jest выглядит следующим образом:

test('Should publish a valid single document', async () => {

      // Arrange
      var documentToPublish = "file1.oas3";

      let sut = new publisher(); 
      let expectedResponse = new PublisherResponse(documentToPublish, "some-data");

      // Act
      let actualResponse = sut.publish(documentToPublish);   

      // Assert
    expect(actualResponse).toEqual(expectedResponse);
    });

Тест не пройден, потому что выполнение не останавливается в асинхронном режиме c Метод executeRequest, пока ожидаемые строки не будут завершены.

В результате я получаю сообщение об ошибке, указывающее, что

Невозможно войти в систему после завершения испытаний. Вы забыли подождать что-то асин c в своем тесте? Попытка занести в журнал «нам нужно дождаться, пока эта вещь закончится sh ...».

Я предпочитаю не заставлять API publi sh сейчас возвращать обещание, если я может сойти с рук. Есть идеи о том, чего мне здесь не хватает?

1 Ответ

1 голос
/ 14 марта 2020

Тест не пройден, потому что выполнение не кажется остановленным в методе async executeRequest, пока не будут завершены ожидаемые строки.

Вы абсолютно правы. Выполнение не останавливается в методе async; вместо этого выполнение возвращается к вызывающей стороне, пока Обещание не выполнит . Вот что происходит:

  1. jest звонки publish
  2. publish звонки executeRequest
  3. executeRequest звонки await request.get...
  4. executeRequest возвращает управление на publish
  5. publish возвращает управление на jest
  6. jest выполняет ожидание
  7. await request.get... возвращает
  8. executeRequest звонки console.log...
  9. шутка жалуется: - (

Это способ async / awaitPromise / then) работает.

Я бы предпочел не заставлять API publi sh пока возвращать обещание, если я смогу сойти с рук. Любые идеи о том, чего мне здесь не хватает?

Мое предложение: не пытайтесь избежать вызова асин c -функции из синхронной функции. Вместо этого пусть publish возвращает Promise. Любой код, который хочет publish чтобы быть огненным и забыть, можете не ждать Promise.

, который изменит ваш код на что-то вроде этого:

export class publisher {

  async publish(file: string): Promise<PublisherResponse> {
     let response = PublisherResponse.EmptyResponse;
     let options = {};
     let promise = this.executeRequest(file , options);
     await promise.then(value => response = value); // return control to caller
     return response;
  }

  async executeRequest(file: string, options: any): Promise<PublisherResponse> {
     let promise = request.get("http://someAPI", options);
     console.debug("we need to wait for this thing to finish ...")
     let response = await promise; // return control to caller
     let data = response.data;
     return new new PublisherResponse(file, data);
  }
}

test('Should publish a valid single document', async () => {
  // Arrange
  var documentToPublish = "file1.oas3";

  let sut = new publisher(); 
  let expectedResponse = new PublisherResponse(documentToPublish, "some-data");

  // Act (return control to caller)
  let actualResponse = await sut.publish(documentToPublish);   

  // Assert
  expect(actualResponse).toEqual(expectedResponse);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...