【问题标题】:Jest - Mocking a React Component's dependency which returns a PromiseJest - 模拟一个返回 Promise 的 React 组件的依赖项
【发布时间】:2019-02-14 09:20:42
【问题描述】:

我有一个具有以下依赖关系的 React 组件:

import { fetchUsers } from '../../api/';

这是一个返回 Promise 的实用函数。

在尝试使用 Jest 模拟此操作时,我无法在 describe() 内的每个测试基础上执行此操作。

我能够模拟fetchUsers 的唯一方法是在整个测试套件的文件顶部使用jest.mock()。

import x from './x'

jest.mock('../../../../src/api/', () => ({
    fetchUsers: jest.fn(() => Promise.resolve({ users: [] })),
}));

这不适合,因为我需要在不同的测试中测试 .then() (Promise.resolve) 和 .catch (Promise.reject)。有了上面,我只能测试.then()

有谁知道如何使用 Jest 模拟 React 组件的依赖项,该依赖项会在每个测试的基础上返回一个承诺?

谢谢

【问题讨论】:

    标签: javascript reactjs mocha.js jestjs create-react-app


    【解决方案1】:

    Jest 模拟函数可以改变实现:

    jest.mock('../../../../src/api/', () => ({
        fetchUsers: jest.fn()
    }));
    
    ...
    const { fetchUsers } = require('../../../../src/api/');
    fetchUsers.mockImplementation(() => Promise.resolve({ users: [] }));
    // do something that calls fetchUsers
    

    正如this answer 中所解释的,由于 ES 模块的工作方式,也可以随时在转译的 * 导入上模拟属性:

    import * as api from '../../../../src/api/';
    
    ...
    jest.spyOn(api, 'fetchUsers').mockImplementation(() => Promise.resolve({ users: [] }));
    // do something that calls fetchUsers
    

    【讨论】:

    • 嗨@estus,我能够让 jest.mock()/require() 方法工作,但无法让 import/spyOn() 方法工作......得到错误.. . 无法设置只有 getter 的 # 的属性 fetchUsers...你知道为什么会这样吗?
    • @JamesGallagher 这是一个已知问题,github.com/webpack/webpack/issues/4039。这取决于模块的配置方式。看起来它们在 create-react-app Jest 设置中没有正确配置,我希望它们是 Jest 中的 CJS,而它们不是。我猜第二种解决方案不适合您的设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-09-11
    • 2022-01-14
    • 2022-06-30
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多