Проверьте логику модульного теста, которая работает внутри Promise.resolve - PullRequest
1 голос
/ 12 апреля 2019

Настройка

  • Реакция: 16,6.0
  • Реактивный: 0,57,4
  • шутка: 23,6,0
  • фермент: 3,5,0

У меня есть следующая логика внутри компонента

onRefresh = () => {
    const { getCustomerAccounts } = this.props
    this.setState({ refreshing: true })
    getCustomerAccounts()
      .then(() => this.setState({ refreshing: false }))
};

, который я пытаюсь проверить, использует jest вот так

  describe('Instance', () => {
    const getCustomerAccountsMock = jest.fn(() => Promise.resolve({}))
    const props = {
      getCustomerAccounts: getCustomerAccountsMock,
    }

    const instance = shallow(<Component {...props} />).instance()

    describe('onRefresh', () => {
      it('should call getCustomerAccounts', () => {
        instance.onRefresh()
        expect(getCustomerAccountsMock).toHaveBeenCalled()
        expect(getCustomerAccountsMock).toHaveBeenCalledTimes(1)
        expect(getCustomerAccountsMock.mock.calls[0][0]).toBeUndefined()
      })
    })
  })

тест работает нормально, но я не могу проверить, что происходит, когда getCustomerAccounts().then() работает

В основном я хочу проверить, установлен ли this.state.refreshing на false, когда getCustomerAccounts().then() работает

Предложения

1 Ответ

1 голос
/ 12 апреля 2019

Верните Promise из onRefresh:

onRefresh = () => {
  const { getCustomerAccounts } = this.props
  this.setState({ refreshing: true })
  return getCustomerAccounts()  // <= return the Promise
    .then(() => this.setState({ refreshing: false }))
};

... тогда вы можете проверить это так:

describe('Instance', () => {
  const getCustomerAccountsMock = jest.fn(() => Promise.resolve({}))
  const props = {
    getCustomerAccounts: getCustomerAccountsMock,
  }

  const wrapper = shallow(<Component {...props} />)
  const instance = wrapper.instance()

  describe('onRefresh', () => {
    it('should call getCustomerAccounts', async () => {  // <= async test function
      await instance.onRefresh()  // <= await the Promise
      expect(getCustomerAccountsMock).toHaveBeenCalled()
      expect(getCustomerAccountsMock).toHaveBeenCalledTimes(1)
      expect(getCustomerAccountsMock.mock.calls[0][0]).toBeUndefined()
      expect(wrapper.state('refreshing')).toBe(false);  // Success!
    })
  })
})

Подробности

Возвращение Promise позволяет вам await в тесте.

Используйте функцию теста async, чтобы вы могли await возвращенные Promise.

Назначьте wrapper переменной, чтобы вы могли использовать ее для проверки состояния.

...