2019独角兽企业重金招聘Python工程师标准>>>

转载地址

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 testfs.__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

转载于:https://my.oschina.net/zhangdapeng89/blog/1845544

React 16 Jest手动模拟(Manual Mocks)相关推荐

  1. React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四

    转载地址 React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三.四 项目初始化 git clone https://github.com/durban89/we ...

  2. React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers)

    转载 React 16 + Jest单元测试 之 Mock Functions(Mock Names 和 Custom Matchers) 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 ...

  3. React 16 Jest单元测试 之 Jest工具

    转载地址 React 16 Jest单元测试 之 Jest工具 项目初始化[这里使用之前的项目,节省时间] 项目初始化地址 https://github.com/durban89/webpack4-r ...

  4. React 16 加载性能优化指南

    关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...

  5. 【译】用 Chrome 开发者工具以及 react 16 版本分析性能

    翻译自:debugging-react-performance-with-react-16-and-chrome-devtools github的地址 欢迎 star 文章主要介绍了用 Chrome ...

  6. 携程回应突发故障:「bug已修复」;罗永浩再嘲iPhone11浴霸相机;React 16.10.0发布|极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  7. React 16.x折腾记 - (1) React Router V4 和antd侧边栏的正确关联及动态title的实现

    前言 一如既往,实战出真理,有兴趣的可以瞧瞧,没兴趣的大佬请止步于此. 效果图 基于antd的sidebar组件封装 折腾记的技术栈选型 Mobx & mobx-react(用起来感觉良好的状 ...

  8. React 16.8.6 发布,构建用户界面的 JavaScript 库

    React 16.8.6 已发布,该版本更新如下: React DOM 修复 useReducer() 中的问题(@acdlite in #15124) 修复 Safari DevTools 中的 i ...

  9. CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐

    这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...

最新文章

  1. 通过goole获取手机唯一标识
  2. swing 状态视图分离_Java Swing模型视图适配器介体
  3. 学习Java编程面向对象的五大基本原则
  4. python能做什么效果_python对于做SEO主要有什么作用?
  5. 去中心化NFT交易生态系统Mochi.Market将在DAO Pad进行SHO
  6. db2 常用命令(二)
  7. 黑客,计算机革命的英雄!
  8. HashMap,LinkedHashMap和Hashtable类的深入剖析与理解
  9. (渝粤教育)网络教育远程教育统考计算机应用基础复习题
  10. 电力系统matlab实验报告,电力系统分析潮流实验报告
  11. 找回 Windows 丢失的拨号密码
  12. 汇川小型PLC-MODBUS(485)通讯模式
  13. python 文件路径斜杠变成两道_Python文件操作---正斜杠与反斜杠
  14. Profinet Commander下载方法
  15. if 条件结构与switch条件选择结构
  16. 从码农到工程师:只要做到这6点
  17. c语言输出星号一行比一行星号少一个,c语言打印空白星号矩形
  18. 计算机英语中文谐音,翻译成中文的英文歌 英文歌用中文谐音唱
  19. C语言 strcat 函数 - C语言零基础入门教程
  20. 【机器学习基础】线性基函数模型

热门文章

  1. 用Backbone.js创建一个联系人管理系统(四)
  2. DecimalFormat 用法
  3. 从背包问题优化详解动态规划思想
  4. 连通图遍历策略之深度优先搜索(C语言)
  5. 编码是件有逻辑的事情
  6. Kylin报错classnotfound:org.apache.hadoop.hive.serde2.typeinfo.typeInfo
  7. 计算机三级基础知识考试题,计算机等级考试PC技术练习题:章基础知识
  8. bootsrap 外边距_Bootstrap CSS 概览
  9. python卸载_删除系统 Python 引发的惨案
  10. php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...