我有一个在它的componentDidMount()函数中执行一些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()的调用并相应地设置状态之后测试呈现的结果。现在在我的测试中,我模拟了对数据库的实际调用,所以承诺应该立即得到解决,但是像这样的测试并不能像预期的那样工作:
最初,我是这样尝试的:
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秒,因为异步调用无论如何都是模拟的,所以它可能也会用更少的时间工作,但我永远不会真正知道)
我的问题是,有没有人对如何解决这个问题有更好的想法?
发布于 2020-12-18 21:59:33
您可以使用wait for expect包: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)的函数现在是一个异步函数。
发布于 2021-02-10 01:23:30
it('should render setNewPassWordScreen', async () => {
const tree = await renderer.create(<IndexScreen/>);
const instance = tree.getInstance();
await instance.componentDidMount();
// expect other stuff.
});https://stackoverflow.com/questions/58399299
复制相似问题