шутка для асинхронных функций - PullRequest
0 голосов
/ 28 января 2019

Я тестирую код, который включает асинхронные функции.Даже при тестировании потока, который не использует await, тест не пройден.Когда я удаляю async / await (что возможно, поскольку тестируемый поток не требует этого), тест проходит.

Я создал упрощенный пример кода и теста.

(1) Пример кода, использующего async / await (хотя в этом нет необходимости, как в моем тестируемом потоке):

import React from 'react'

export class Example extends React.Component {
  state = { first: false }

  async func1 () {
    const selection = await this.func2()
    this.setState({ first: selection })
  }

  async func2 () {
    return true
  }

  render () {
    return null
  }
}

(2) Тот же код без async / await:

import React from 'react'

export class Example extends React.Component {
  state = { first: false }

  func1 () {
    const selection = this.func2()
    this.setState({ first: selection })
  }

  func2 () {
    return true
  }

  render () {
    return null
  }
}

И этот тест не пройден (третий expect не пройден) для (1) и пройден для (2).Любая идея, почему и как написать тест, чтобы он работал для кода с async / await?

import React from 'react'
import { shallow } from 'enzyme'
import { Example } from '../../src/scenes/Recommendation/Patterns/Example'

let wrapper

describe('Testing Example', () => {
  it('calls func1 properly', async () => {
    wrapper = shallow(
      <Example />
    )
    const instance = wrapper.instance()

    const prevState = { first: false }
    const expectedState = { first: true }

    expect.assertions(2)
    expect(instance.state).toEqual(prevState)
    await instance.func1()
    expect(instance.state).toEqual(expectedState)
  })
})

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Возможно, вы сталкиваетесь с этой проблемой, при которой обещания не сбрасываются.

Попробуйте добавить обновление вашего теста в следующую

describe('Testing Example', () => {
  function flushPromises() {
    return new Promise(resolve => setImmediate(resolve));
  }

  it('calls func1 properly', async () => {
    wrapper = shallow(
      <Example />
    )
    const instance = wrapper.instance()

    const prevState = { first: false }
    const expectedState = { first: true }

    expect.assertions(2)
    expect(instance.state).toEqual(prevState)
    await instance.func1()
    await flushPromises();
    expect(instance.state).toEqual(expectedState)
  })
});
0 голосов
/ 28 января 2019

Не могли бы вы уточнить, на каком ожидании ваши тесты не пройдут?Это с первым ожиданием или со вторым?

Одна вещь, о которой я могу подумать, так это то, что jest естественным образом тестирует функции синхронно, если у вас есть асинхронный код в тестируемых функциях, они произойдут после стека вызовов в конце вашей тестовой функции.Вместо этого вам нужно будет добавить

expect.assertions(2);

в начале ваших тестовых функций, чтобы он ожидал завершения асинхронных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...