首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用react-test-renderer测试异步componentDidMount()

使用react-test-renderer测试异步componentDidMount()
EN

Stack Overflow用户
提问于 2019-10-16 00:46:37
回答 2查看 627关注 0票数 1

我有一个在它的componentDidMount()函数中执行一些SQLite加载的组件

代码语言:javascript
复制
async componentDidMount() {
    try {
        const user = await this.userDao.getUserData();
        const setupNeeded = user === null;
        if( setupNeeded ) {
            this.setState({
                status : 'setup'
            });
        }
        else {
            this.setState({
                status : 'ready',
                seed: user.seed
            })
        }
    } catch (e) {
        logger.error("Error during db query", e);
        this.setState({
            status: 'corrupted'
        });
    }
}

我想在解决对getUserData()的调用并相应地设置状态之后测试呈现的结果。现在在我的测试中,我模拟了对数据库的实际调用,所以承诺应该立即得到解决,但是像这样的测试并不能像预期的那样工作:

最初,我是这样尝试的:

代码语言:javascript
复制
test('Should render SetNewPasswordScreen', async () => {
    const tree = await renderer.create(<IndexScreen/>);
    const json = tree.toJSON();
    // expect stuff
});

但是,本例中的json包含初始render()调用的数据。

这样做是可行的:

代码语言:javascript
复制
 test('Should render SetNewPasswordScreen', (done) => {
     const tree = renderer.create(<IndexScreen/>);
     setTimeout(() => {
         const json = tree.toJSON();
         // expect stuff
     }, 5000);
 });

但这并不理想,因为我只是猜测5秒后一切都会完成,但我不知道。此外,如果测试需要5秒才能完成,那么它就不太合适。(我随意使用了5秒,因为异步调用无论如何都是模拟的,所以它可能也会用更少的时间工作,但我永远不会真正知道)

我的问题是,有没有人对如何解决这个问题有更好的想法?

EN

回答 2

Stack Overflow用户

发布于 2020-12-18 21:59:33

您可以使用wait for expect包:https://www.npmjs.com/package/wait-for-expect

代码语言:javascript
复制
test('Should render SetNewPasswordScreen', async (done) => {
     const tree = renderer.create(<IndexScreen/>);

     await waitForExpect(() => {
       const json = tree.toJSON();
       // expect stuff
     });
 });

注意,传入test('...', fn)的函数现在是一个异步函数。

票数 0
EN

Stack Overflow用户

发布于 2021-02-10 01:23:30

代码语言:javascript
复制
it('should render setNewPassWordScreen', async () => {
   const tree = await renderer.create(<IndexScreen/>);
   const instance = tree.getInstance();

   await instance.componentDidMount();
   // expect other stuff.
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58399299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档