【问题标题】:Mocking a Promise that Resolves to a Reponse Object模拟解析为响应对象的 Promise
【发布时间】:2018-10-10 03:12:05
【问题描述】:

我的 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?
    }
}

因为我使用的是来自here.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

谢谢

【问题讨论】:

    标签: angular promise jasmine


    【解决方案1】:
    const MockBoxItem = {
        promise: new Promise<any>((resolve, reject) => resolve(
           {
             json:()=>{
                return JSON.stringify(myData)
             }
           }
        )
    };
    

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

    【讨论】:

    • 这绝对让我朝着正确的方向前进。然而,这是我目前从item.promiseZoneAwarePromise{__zone_symbol__state: true, __zone_symbol__value: Object{json: function () { ... }}} 中得到的。对我来说,通过执行await item.promise,我会得到值,但相反,它会返回undefined。有什么想法吗?
    • 看我的小提琴。修复回报
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2020-04-24
      • 2012-07-07
      • 2011-08-09
      • 2018-10-18
      • 2021-03-15
      • 2021-08-10
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多