`react-apollo``MockedProvider`需要超时?

时间:2018-05-08 02:01:19

标签: javascript react-apollo apollo-client

我正在使用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

有更优雅的方式来解决这个问题吗?

2 个答案:

答案 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();