Reputation: 4096
I'm using jest
with react-apollo's MockedProvider
and I'm having trouble because the MockedProvider
seems to be behaving asynchronously.
Given the following simple component:
const Component = () => <Query query={query}>(({loading, data }) => if(loading) return 'loading' else if (data) return 'data' else return 'nothing'</Query>
This test:
it('', done => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
expect(renderer.toJSON()).toMatchSnapshot()
shows a snapshot of: loading
but if I add a simple timeout of 1 ms:
it('', done => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
setTimeout(() => {
expect(renderer.toJSON()).toMatchSnapshot()
done()
}, 1);
I get a snapshot of: data
Is there a more elegant way to get around this?
Upvotes: 3
Views: 2053
Reputation: 2753
You can use waait lib like shown at this docs
it('',async () => {
const renderer = TestRenderer.create(
<MockedProvider mocks={myMock} >
<Component/>
</MockedProvider>
)
await wait(0);
expect(renderer.toJSON()).toMatchSnapshot();
Upvotes: 2
Reputation: 4096
I'm curious if other's have ideas.
Right now having to do something like this:
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)
})
}
and using it in a test:
const renderer = await AsyncTestRenderer(
<MockedProvider mocks={mocks} >
<MyComponent/>
</MockedProvider>
)
expect(renderer.toJSON()).toMatchSnapshot() // renders data from mock Query
Upvotes: 1