【问题标题】:How do I mock react-router-dom using jest from a __mocks__ directory如何使用 __mocks__ 目录中的 jest 模拟 react-router-dom
【发布时间】:2021-01-10 04:45:34
【问题描述】:

我有一个正在测试提供程序的测试,它使用 react-router 6 useLocation

"react-router-dom": "^6.0.0-beta.0",

当我在文件中模拟时它工作正常

import React from 'react';
import { render } from '@testing-library/react';
import Categories from './Categories';
import mockCategories from '../../__mocks__/mockCategories';
import ExpenditureProvider from '../../domains/Expenditure/ExpenditureProvider';

jest.mock('react-router-dom', () => {
  const originalModule = jest.requireActual('react-router-dom');

  return {
    __esModule: true,
    ...originalModule,
    useNavigate: jest.fn(),
    useLocation: jest.fn().mockReturnValue({ pathname: '/'}),
  };
});

describe('Categories', () => {
  test('should render Categories component', () => {
    const categories = render(
      <ExpenditureProvider>
        <Categories categories={mockCategories}/>
      </ExpenditureProvider>
      );
  });
});

但是当我尝试将其放入__mocks__ 目录时,这是我得到的错误

Error: Uncaught [Error: useLocation() may be used only in the context of a <Router> component.]
// __mocks__/react-router-dom.js

const originalModule = jest.requireActual('react-router-dom');
export default {
  __esModule: true,
  ...originalModule,
  useLocation: jest.fn().mockReturnValue({ pathname: '/'}),
  useNavigate: jest.fn()
}

mock 文件在 node_modules 的根目录下

├── __mocks__
│   └── react-router-dom.js
├── node_modules
├── src
│ 

我想做的只是从__mocks__ 目录模拟,因为这个模拟用于多个测试

【问题讨论】:

  • 请用确切的错误信息更新问题,而不是模糊的it doesn't work语句,它可能对有类似问题的用户有所帮助。
  • @EstusFlask 这是我得到的错误 Error: Uncaught [Error: useLocation() may be used only in the context of a component.],你读过这个问题了吗?!我已将其移动以使其更清晰
  • 谢谢。不清楚该错误是指您使用 __mocks__ 而不是根本没有模拟的场景。

标签: reactjs unit-testing react-router jestjs


【解决方案1】:

mock 错误地将模块内容导出为default 而不是*。无法使用 ES 模块 export 语法动态定义 * 导出。需要使用 CommonJS 导出,它的工作方式与 jest.mock 返回相同,__esModule: true 使其工作方式类似于 * ESM 导出:

const originalModule = jest.requireActual('react-router-dom');
module.exports = {
  __esModule: true,
  ...originalModule,
  useLocation: jest.fn().mockReturnValue({ pathname: '/'}),
  useNavigate: jest.fn()
}

【讨论】:

  • 这是您发布的代码中唯一的问题。至于错误,mock 没有被拾取。 Jest 最初期望它与 node_modules 一起使用,就像您所做的那样。如果你使用 create-react-app 项目,请将__mocks__ 移动到src,参见github.com/facebook/create-react-app/issues/7539
  • 谢谢!这是问题的另一半,一旦我把它移到src 它就起作用了,正如你所说,它不适用于导出默认值,非常感谢你太棒了
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2018-12-04
  • 2020-03-11
  • 2021-04-14
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2023-02-15
相关资源
最近更新 更多