Обещание разрешается после ожидаемого, но данные не определены - PullRequest
0 голосов
/ 17 марта 2020

JavaScript гуру, что мне здесь не хватает?

Простой тестовый сценарий выглядит следующим образом:

   import * as request from "request-promise-native";

   export class Publisher {

        name : string = "IRocking Publisher";

        async publishAsync(): Promise<PublisherResponse> {

              var publisherResponse : PublisherResponse = PublisherResponse.EmptyResponse;

              try {

                    let response = await request.get("https://jsonplaceholder.typicode.com/todos/1");

                    console.debug("Promise has been resolved.  Result is:")
                    console.debug(response)

                    console.debug(response.userId)
                    publisherResponse = new PublisherResponse(file, this.name, true, "");
                  }
                  catch (error) {
                    publisherResponse = new PublisherResponse(file, this.name, false, error);
                 }

                return Promise.resolve<PublisherResponse>(publisherResponse); 
            }
    }

С сопровождающим тестом Jest следующим образом:

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

      // Arrange

        let sut = new Publisher(); 
        let expectedResponse = new PublisherResponse(documentToPublish, sut.name, true, "");

        // Act
        let actualResponse = await sut.publishAsync(new PublicationContext(), documentToPublish);   

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

Когда я запускаю тест, я вижу данные, возвращаемые из службы, как

 {
        "userId": 1,
        "id": 1,
        "title": "delectus aut autem",
        "completed": false
      }

Но если я пытаюсь получить доступ к свойству данных, например "userId", я получаю неопределенное значение. Что мне не хватает?

Кроме того, как я могу получить другие коды состояния кроме 200 из этого запроса?

1 Ответ

0 голосов
/ 17 марта 2020

Мне нужно было десериализовать строку JSON, возвращенную службой, используя

  var todo = JSON.parse(response);

. По какой-то причине я предполагал, что ответ в

let response = await request.get("https://jsonplaceholder.typicode.com/todos/1");

был объектом, но базовый тип - string . Я узнал это с помощью следующего кода:

   let propertyNames = Object.keys(response);
    console.debug(propertyNames);
    propertyNames.forEach((p, i) => {
              console.debug(response[p])
            })
...