嘲笑一个解决了反应对象的承诺

时间:2018-04-30 03:14:03

标签: angular promise jasmine

我的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(),来自here,我很好奇我将如何在单元测试中嘲笑这个?

我现在正在这样做:

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 :(得分:0)

const MockBoxItem = {
    promise: new Promise<any>((resolve, reject) => resolve(
       {
         json:()=>{
            return JSON.stringify(myData)
         }
       }
    )
};

这里是JsFiddle https://jsfiddle.net/n932pvt3/1/

答案 1 :(得分:0)

在响应正文中包含{"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()