Дразня обещание, которое разрешается в ответном объекте - PullRequest
0 голосов
/ 30 апреля 2018

В моем Angular-компоненте есть участки кода, которые выглядят следующим образом:

for (const item of items) {
    const boxItems = item.boxItems;
    if (await self.hasID(boxItems)) {
        // perform some logic
    }
}

private async hasID(boxItems: BoxItems[]): Promise<boolean> {
    for (const item of boxItems) {
        let info = (await item.promise).json();
        // test fails here, info remains undefined
        // how to properly mock a Response object from a Promise at this point?
    }
}

Поскольку я использую .json(), исходя из здесь , мне было любопытно, как я смогу смоделировать это в моем модульном тесте?

Я сейчас занимаюсь этим:

const MockBoxItem = {
    promise: new Promise<any>((resolve, reject) => resolve(myData))
};

Должен ли я вместо этого делать что-то вроде:

const MockBoxItem = {
    promise: new Promise<any>((resolve, reject) => resolve(
        new Response(new Body([JSON.stringify(myData)]))
    )
};

Мой модульный тест не пройден, так как я подозреваю, что возвращаемые мной макетные данные неправильно реализуют объект Response, поэтому не содержат метод .json().

Когда я проверяю этот поток локально, возвращаемый ответ выглядит так:

promise: ZoneAwarePromise
    _zone_symbol_state: true
    _zone_symbol_value: Response
        headers: ...
        ok: ...
        status: ...
        statusText: ...
        type: ...
        url: ...
        _body: myData

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Макет ответа, который содержит {"foo":"bar"} в теле ответа. Я думаю, что response.json() должен вернуть обещание объекта JSON.parsed.

const MockBoxItem = {
  promise: Promise.resolve(new Response(JSON.stringify({foo:"bar"})))
}

async function asyncCall() {
  const result = await MockBoxItem.promise
  const data = await result.json()
  console.log(data) // { foo: 'bar' }
}

asyncCall()
0 голосов
/ 30 апреля 2018
const MockBoxItem = {
    promise: new Promise<any>((resolve, reject) => resolve(
       {
         json:()=>{
            return JSON.stringify(myData)
         }
       }
    )
};

Вот JsFiddle https://jsfiddle.net/n932pvt3/1/

...