简体   繁体   English

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

[英]`react-apollo` `MockedProvider` requires timeout?

I'm using jest with react-apollo's MockedProvider and I'm having trouble because the MockedProvider seems to be behaving asynchronously.我在 react-apollo 的MockedProvider使用jest并且我遇到了麻烦,因为MockedProvider似乎是异步运行的。

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显示快照: loading

but if I add a simple timeout of 1 ms:但如果我添加一个简单的 1 毫秒超时:

  it('', done => {
    const renderer = TestRenderer.create(
      <MockedProvider mocks={myMock} >
        <Component/>
      </MockedProvider>
    )

    setTimeout(() => {
      expect(renderer.toJSON()).toMatchSnapshot()
      done()
    }, 1);

I get a snapshot of: data我得到了一个快照: data

Is there a more elegant way to get around this?有没有更优雅的方法来解决这个问题?

You can use waait lib like shown at this docs您可以使用此文档中所示的 waait lib

it('',async () => {
    const renderer = TestRenderer.create(
      <MockedProvider mocks={myMock} >
        <Component/>
      </MockedProvider>
    )
    await wait(0);
    expect(renderer.toJSON()).toMatchSnapshot();

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 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM