【问题标题】:Jest mock async calls inside react component在反应组件中开玩笑模拟异步调用
【发布时间】:2017-07-27 02:32:22
【问题描述】:

我是 jest/enzyme 的新手,正在尝试模拟对返回 Promise 的 aync 函数的调用,该调用是在 componentDidMount 方法中的反应组件内部进行的。

该测试正在尝试测试 componentDidMount 将 Promise 返回的数组设置为 state。

我遇到的问题是测试在数组添加到状态之前完成并通过。我正在尝试使用“完成”回调让测试等到承诺解决,但这似乎不起作用。

我试图将期望调用移到 done() 调用之前的行,但这似乎也不起作用。

谁能告诉我我在这里做错了什么?

正在测试的组件:

componentDidMount() {
  this.props.adminApi.getItems().then((items) => {
    this.setState({ items});
  }).catch((error) => {
    this.handleError(error);
  });
}

我的测试:

    import React from 'react';
    import { mount } from 'enzyme';
    import Create from '../../../src/views/Promotion/Create';

    import AdminApiClient from '../../../src/api/';
    jest.mock('../../../src/api/AdminApiClient');

    describe('view', () => {

      describe('componentDidMount', () => {

        test('should load items into state', (done) => {
          const expectedItems = [{ id: 1 }, { id: 2 }];

          AdminApiClient.getItems.mockImplementation(() => {
            return new Promise((resolve) => {
              resolve(expectedItems);
              done();
            });
          });

          const wrapper = mount(
            <Create adminApi={AdminApiClient} />
          );

          expect(wrapper.state().items).toBe(expectedItems);
        });

      });
    });

【问题讨论】:

    标签: javascript unit-testing reactjs jestjs enzyme


    【解决方案1】:

    您的测试有两个问题。首先你不能像这样模拟AdminApiClientjest.mock 将仅用 undefined 替换模块,因此 getItems.mockImplementation 将无效或抛出错误。也没有必要使用原来的。当您通过道具将其作为参数传递时,您可以在测试中直接创建您的模拟。其次,如果您使用 Promise,您要么必须从测试中返回 Promise,要么使用 async/await (docs):

    it('', async() = > {
      const expectedItems = [{ id: 1 }, { id: 2 }];
      const p = Promise.resolve(expectedItems)
      AdminApiClient = {
        getItems: () = > p
      }
      const wrapper = mount(
        <Create adminApi={AdminApiClient} />
      );
      await p
      expect(wrapper.state().items).toBe(expectedItems);
    })
    

    【讨论】:

    • 感谢您的解释,这种方法效果很好!也能够通过使用 Promise.reject() 和 try/catch 块,并等待 p.catch() 以这种方式测试错误场景。
    猜你喜欢
    • 2021-05-22
    • 2019-06-14
    • 2021-09-12
    • 2019-11-19
    • 2021-09-25
    • 2018-05-05
    • 1970-01-01
    • 2022-11-22
    • 2023-02-09
    相关资源
    最近更新 更多