React 16 Jest手动模拟(Manual Mocks)

简介: 转载地址React 16 Jest手动模拟(Manual Mocks)项目初始化git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git cd webpack4-react16-reactrouter-demogit fetch origingit checkout v_1.0.27npm install 手动模拟(Manual Mocks)手动模拟主要功能是用于存储模拟的数据。

转载地址

React 16 Jest手动模拟(Manual Mocks)

项目初始化

git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git 
cd webpack4-react16-reactrouter-demo
git fetch origin
git checkout v_1.0.27
npm install

 

手动模拟(Manual Mocks)

手动模拟主要功能是用于存储模拟的数据。

例如,我可能希望创建一个允许您使用虚假数据的手动模拟,而不是访问网站或数据库等远程资源。

这可以确保您的测试快速且不易碎(not flaky)。

 

模拟水果模块(Mocking fruit modules)

通过在紧邻模块的__mocks__/子目录中编写模块来定义手动模拟。这个方式我在前面文章中的实例中也有用到过,具体的可以参考之前的文章,这里我说下大概的流程

例如,要在src/lib目录中模拟一个名为fruit的模块,则分别创建文件src/lib/fruit.js和文件src/lib/__mocks__/fruit.js的文件。

请注意__mocks__文件夹区分大小写。如果命名目录是__MOCKS__,则可能在某些系统上测试的时候会中断。

注意点

当我们在测试中需要该模块时,还需要显式的调用jest.mock('./moduleName')。

模拟Node核心模块(Mocking Node modules)

如果正在模拟的模块是Node module(例如:lodash),则模拟应放在与node_modules相邻的__mocks__目录中(除非您将根配置为指向项目根目录以外的文件夹)并将自动模拟。

没有必要显式调用jest.mock('module_name')。

可以通过在与范围模块的名称匹配的目录结构中创建文件来模拟范围模块。

例如,要模拟名为@scope/project-name的作用域模块,请在__mocks__/@scope/project-name.js创建一个文件,相应地创建@scope/目录。

注意点

如果我们想模拟Node的核心模块(例如:fs或path),那么明确地调用。

例如:jest.mock('path')是必需的,因为默认情况下不会模拟核心Node模块。

实例演示

当给定模块存在手动模拟时,Jest的模块系统将在显式调用jest.mock('moduleName')时使用该模块。

但是,当automock设置为true时,即使未调用jest.mock('moduleName'),也将使用手动模拟实现而不是自动创建的模拟。

要选择不使用此行为,您需要在应使用实际模块实现的测试中显式调用jest.unmock('moduleName')。

 

注意点

为了正确模拟,Jest需要jest.mock('moduleName')与require/import语句在同一范围内。

 

假设我们有一个模块,它提供给定目录中所有文件的摘要。在这种情况下,我们使用核心(内置)fs模块来演示

 

src/lib/FileSummarizer.js

const fs = require('fs');

function summarizeFilesInDirectorySync(directory) {
  return fs.readdirSync(directory).map(fileName => ({
    directory,
    fileName,
  }));
}

exports.summarizeFilesInDirectorySync = summarizeFilesInDirectorySync;

 

由于我们希望我们的测试避免实际操作磁盘(这非常慢且易碎[fragile]),我们通过扩展自动模拟为fs模块创建手动模拟。

我们的手动模拟将实现我们可以为我们的测试构建的fs API的自定义版本:

src/lib/__mocks__/fs.js

const path = require('path');

const fs = jest.genMockFromModule('fs');

let mockFiles = Object.create(null);

function __setMockFiles(newMockFiles) {
  mockFiles = Object.create(null);

  const keys = Object.keys(newMockFiles);

  for (let index = 0; index < keys.length; index += 1) {
    const file = keys[index];
    const dir = path.dirname(file);
    if (!mockFiles[dir]) {
      mockFiles[dir] = [];
    }
    mockFiles[dir].push(path.basename(file));
  }
}

function readdirSync(directoryPath) {
  return mockFiles[directoryPath] || [];
}

fs.__setMockFiles = __setMockFiles;
fs.readdirSync = readdirSync;

module.exports = fs;

现在我们编写测试。

请注意,我们需要明确告诉我们要模拟fs模块,因为它是一个核心Node模块:

src/__tests__/FileSummarizer-test.js

const fs = require('fs');
const FileSummarizer = require('../lib/FileSummarizer');


jest.mock('fs');

describe('listFilesInDirectorySync', () => {
  const MOCK_FILE_INFO = {
    '/path/to/file1.js': 'console.log("file1 contents");',
    '/path/to/file2.txt': 'file2 contents',
  };

  beforeEach(() => {
    // Set up some mocked out file info before each test
    fs.__setMockFiles(MOCK_FILE_INFO);
  });

  test('includes all files in the directory in the summary', () => {
    const fileSummary = FileSummarizer.summarizeFilesInDirectorySync('/path/to');

    expect(fileSummary.length).toBe(2);
  });
});

此处显示的示例模拟使用jest.genMockFromModule生成自动模拟,并覆盖其默认行为。

这是推荐的方法,但完全是可选的。

如果您根本不想使用自动模拟,则只需从模拟文件中导出自己的函数即可。

完全手动模拟的一个缺点是它们是手动的 - 这意味着你必须在它们模拟的模块发生变化时手动更新它们。

因此,最好在满足您的需求时使用或扩展自动模拟。

为了确保手动模拟及其实际实现保持同步,在手动模拟中使用require.requireActual(moduleName)并在导出之前使用模拟函数修改它可能是有用的。

 

项目实践地址

https://github.com/durban89/webpack4-react16-reactrouter-demo.git
tag:v_1.0.28

目录
相关文章
|
4月前
|
资源调度 前端开发 JavaScript
React的测试:使用Jest和React Testing Library进行深入探索
【4月更文挑战第25天】本文探讨了使用Jest和React Testing Library进行React测试的方法。Jest是Facebook推出的JavaScript测试框架,适合React测试,提供全面的API和功能。React Testing Library侧重于组件行为,提倡按用户交互方式测试。安装这两个工具后,可通过编写测试用例(如模拟点击事件)来验证组件功能。运行Jest可执行测试并显示结果。此外,还介绍了高级测试技巧和模拟功能,强调了它们对于确保组件正确性、提升开发效率的重要性。
|
3月前
|
前端开发 JavaScript 测试技术
Jest与React Testing Library:前端测试的最佳实践
Jest和React Testing Library是React应用测试的核心工具。安装相关依赖后,在`jest.config.js`中配置Jest。测试时,编写描述性测试用例,使用`render`、`fireEvent`和`screen`来检查组件行为。Jest提供模拟功能,如模拟API调用。测试组件交互性时,模拟用户行为并验证状态变化。确保覆盖边缘情况,使用代码覆盖率报告评估测试完整性,并将测试集成到CI流程中。
54 1
|
前端开发 JavaScript 测试技术
全网最细:Jest+Enzyme测试React组件(包含交互、DOM、样式测试)
Jest是目前前端工程化下单元测试火热的技术栈,而Enzyme的支持提供了Jest测试React业务、组件的能力,下面来介绍一下React组件测试的一些实际场景。
112 1
|
资源调度 JavaScript 前端开发
react+jest+enzyme配置及编写前端单元测试UT
react+jest+enzyme配置及编写前端单元测试UT
125 0
|
资源调度 前端开发 JavaScript
react生态下jest单元测试
react生态下jest单元测试
1849 1
react生态下jest单元测试
|
前端开发 测试技术 API
React 16 Jest单元测试 之 Mock Functions (Mocking Modules 和 Mock Implementations)
转载 React16 Jest单元测试 之 Mock Functions(Mocking Modules 和 Mock Implementations) 项目初始化【这里使用之前的项目,节省时间】 项目初始化地址 https://github.
1856 0
|
前端开发 测试技术 开发工具
React 16 Jest单元测试 之 Mock Functions(Mock Return Values)
转载地址 React16 Jest单元测试 之 Mock Functions(Mock Return Values) 项目初始化【这里使用之前的项目,节省时间】 项目初始化地址 https://github.
1375 0
|
前端开发 JavaScript 测试技术
React 16 之 测试单元(Jest+React+Enzyme)
转载地址: React16 之 测试单元(Jest+React+Enzyme) 安装 enzyme 相关 npm install enzyme enzyme-adapter-react-16 --save-dev np...
1840 0
|
1月前
|
前端开发 JavaScript UED
React 基础与实践 | 青训营笔记
React 基础与实践 | 青训营笔记
40 0
|
2月前
|
前端开发 JavaScript Java
React 速通笔记
【7月更文挑战第17天】
35 1

热门文章

最新文章