
[英]How to find for a text element, in react-test-renderer renderer instance?
[英]Testing async componentDidMount() with react-test-renderer
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
我有一个组件,它在它的componentDidMount()
function 中加载了一些 SQLite
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()
的调用后测试渲染结果,并且相应地设置了 state。 现在在我的测试中,我已经模拟了对数据库的实际调用,所以 Promise 应该立即解决,但是这样的测试不能按预期工作:
最初,我是这样尝试的:
test('Should render SetNewPasswordScreen', async () => {
const tree = await renderer.create(<IndexScreen/>);
const json = tree.toJSON();
// expect stuff
});
但是,在这种情况下,json 包含初始render()
调用的数据。
这样做会起作用:
test('Should render SetNewPasswordScreen', (done) => {
const tree = renderer.create(<IndexScreen/>);
setTimeout(() => {
const json = tree.toJSON();
// expect stuff
}, 5000);
});
但这并不理想,因为我只是猜测 5 秒后一切都会完成,但我不知道。 此外,如果测试需要 5 秒才能完成,则不太合适。 (我任意使用了 5 秒,可能它也可以使用更少的时间,因为异步调用无论如何都会被模拟,但我永远无法真正知道)
我的问题是,是否有人对如何解决这个问题有更好的想法?
你可以使用等待期望 package: https://www.npmjs.com/package/wait-for-expect
test('Should render SetNewPasswordScreen', async (done) => {
const tree = renderer.create(<IndexScreen/>);
await waitForExpect(() => {
const json = tree.toJSON();
// expect stuff
});
});
注意传递给test('...', fn)
现在是异步 function。
it('should render setNewPassWordScreen', async () => {
const tree = await renderer.create(<IndexScreen/>);
const instance = tree.getInstance();
await instance.componentDidMount();
// expect other stuff.
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.