我正在使用jest
和react-apollo的MockedProvider
而我遇到了麻烦,因为MockedProvider
似乎是异步行为。
给出以下简单组件:
const Component = () => <Query query={query}>(({loading, data }) => if(loading) return 'loading' else if (data) return 'data' else return 'nothing'</Query>
这个测试:
it('', done => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
expect(renderer.toJSON()).toMatchSnapshot()
显示了以下内容的快照:loading
但如果我添加1 ms的简单超时:
it('', done => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
setTimeout(() => {
expect(renderer.toJSON()).toMatchSnapshot()
done()
}, 1);
我得到了一张快照:data
有更优雅的方式来解决这个问题吗?
答案 0 :(得分:1)
我很好奇其他人是否有想法。
现在必须做这样的事情:
export const AsyncTestRenderer = async elements => {
/** Render, then allow the event loop to be flushed before returning */
const renderer = TestRenderer.create(elements)
return new Promise(resolve => {
setTimeout(() => resolve(renderer), 1)
})
}
并在测试中使用它:
const renderer = await AsyncTestRenderer(
<MockedProvider mocks={mocks} >
<MyComponent/>
</MockedProvider>
)
expect(renderer.toJSON()).toMatchSnapshot() // renders data from mock Query
答案 1 :(得分:1)
您可以使用docs中显示的waait lib
it('',async () => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
await wait(0);
expect(renderer.toJSON()).toMatchSnapshot();