`реагировать-apollo`` MockedProvider` требует тайм-аут? - PullRequest
0 голосов
/ 08 мая 2018

Я использую jest с 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 мс:

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

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

Я получаю снимок: data

Есть ли более элегантный способ обойти это?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Вы можете использовать waait lib, как показано на этом документах

it('',async () => {
    const renderer = TestRenderer.create(
      <MockedProvider mocks={myMock} >
        <Component/>
      </MockedProvider>
    )
    await wait(0);
    expect(renderer.toJSON()).toMatchSnapshot();
0 голосов
/ 08 мая 2018

Мне любопытно, есть ли у других идеи.

Сейчас нужно сделать что-то вроде этого:

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 
...