如何使Jest在期待断言之前等待所有异步代码完成执行

我正在为一个React应用程序编写一个集成测试,即一个将多个组件一起测试的测试,并且我想模拟对外部服务的任何调用。

问题是测试似乎在执行异步回调之前执行,导致我的测试失败。

有没有办法解决?我可以以某种方式等待调用异步代码完成吗?

这是一些错误的代码来说明我的观点。

我想测试一下,当我挂载Parent时,其Child组件将呈现从外部服务返回的内容,我将对此进行模拟。

class Parent extends component
{
     render ()
     {
         <div>
            <Child />
         </div>
     }
}
class Child extends component
{
     DoStuff()
     {
         aThingThatReturnsAPromise().then((result) => {
           Store.Result = result
         })
     }

    render()
    {
       DoStuff()
       return(<div>{Store.Result}</div>)


    }
}
function aThingThatReturnsAPromise()
{
     return new Promise(resolve =>{
          eternalService.doSomething(function callback(result) {
               resolve(result)
          }
    }

}

当我在测试中执行此操作时,它会失败,因为它在触发回调之前已执行。

jest.mock('eternalService', () => {
    return jest.fn(() => {
        return { doSomething: jest.fn((cb) => cb('fakeReturnValue');
    });
});

describe('When rendering Parent', () => {
    var parent;

    beforeAll(() => {
        parent = mount(<Parent />)
    });

    it('should display Child with response of the service', () => {
        expect(parent.html()).toMatch('fakeReturnValue')
    });
});

我该如何测试?我知道angular使用zonejs解决了这个问题,React中是否有等效的方法?

塔达斯·塔纳塔维修斯(Tadas Antanavicius)

这是一个片段,等待解决待处理的Promises:

const flushPromises = () => new Promise(setImmediate);

请注意,setImmediate是非标准功能(并且不应成为标准功能)。但是,如果足以满足您的测试环境,则应该是一个很好的解决方案。其说明:

此方法用于中断长时间运行的操作并在浏览器完成其他操作(例如事件和显示更新)后立即运行回调函数。

以下是使用async / await大致使用它的方法:

it('is an example using flushPromises', async () => {
    const wrapper = mount(<App/>);
    await flushPromises();
    wrapper.update(); // In my experience, Enzyme didn't always facilitate component updates based on state changes resulting from Promises -- hence this forced re-render

    // make assertions 
});

如果您想要一些实际的示例,在这个项目中经常使用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

你如何等待所有异步调用在Java中完成?

如何确保所有异步功能在执行延迟之前运行

如何知道所有异步HTTP调用已完成

等待直到带有异步网络请求的swift for loop完成执行

在加载数据之前完成所有异步请求?

如何在停止io_service之前等待所有挂起的完成处理程序执行?

如何在Node.js中等待所有异步任务完成?

如何在node.js中等待带有异步请求的循环完成?

在所有异步HTTP调用完成之前如何显示加载指示器-Angular

承诺-如何使异步代码在没有异步/等待的情况下同步执行?

如何知道所有异步功能何时完成?

异步和等待-如何等待所有任务完成?

节点在执行代码之前等待所有异步调用

如何等待所有异步完成?

具有异步lambda的Parallel.ForEach等待所有迭代完成

如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

TestCafe RequestLogger-如何在对每个请求对象进行断言之前等待所有响应返回

如何在嵌套的foreach中继续操作之前确保所有异步调用完成

如何等待所有异步调用完成

如何使Parallel等待所有异步任务完成?

确保主线程不会在执行所有异步方法之前死亡

完成所有异步Http请求后执行功能

如何等待异步方法中的等待完成所有执行?

如何获取异步代码以等待所有任务完成?

等待完成异步 lambda 表达式中的所有异步方法

Tornado - 如何从 on_connection_close 停止所有异步“等待”

Django 频道从 Celery 任务发送组消息。异步事件循环在所有异步任务完成之前停止

在 Flutter 中执行之前等待所有异步函数完成

等待所有异步方法完成