开玩笑的异步功能

时间:2019-01-28 16:27:44

标签: reactjs jestjs

我正在测试包含异步功能的代码。即使在测试不使用等待的流时,测试也会失败。当我删除async / await(这是可能的,因为测试的流程不需要它)时,测试通过。

我已经构建了代码和测试的简化示例。

(1)使用async / await的代码示例(尽管不需要,如我的测试流程所示):

const textRange as GoogleAppsScript.Slides.TextRange;
textRange.getRange(start, end).select();

(2)没有异步/等待的相同代码:

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

这是测试(1)失败(第三个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 } } 失败)并通过(2)的测试。知道为什么以及如何编写测试,以便使用async / await进行代码工作吗?

expect

2 个答案:

答案 0 :(得分:0)

您能否说明测试失败的期望是什么?是第一个期望还是第二个期望?

我能想到的一件事是,由于jest自然会同步测试功能,因此,如果要测试的功能中包含异步代码,则它们将在测试功能结束时的调用堆栈之后发生。相反,您将需要添加

expect.assertions(2);

在测试功能的开头,因此它等待异步功能完成运行。

答案 1 :(得分:0)

您可能遇到this问题,其中的承诺没有兑现。

尝试将更新测试用例添加到以下内容

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)
  })
});