开发者社区> durban> 正文

React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例二

简介: 转载地址 React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例二 项目初始化 git clone https://github.
+关注继续查看

转载地址

React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例二


项目初始化

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

ES6 Class Mocks(使用ES6语法类的模拟)

Jest可用于模拟导入到要测试的文件中的ES6语法的类。

ES6语法的类是具有一些语法糖的构造函数。因此,ES6语法的类的任何模拟都必须是函数或实际的ES6语法的类(这也是另一个函数)。
所以可以使用模拟函数来模拟它们。如下

ES6语法的类测试实例二,今天使用第二种方式 - 手动模拟(Manual mock)

ES6语法类的实例

这里的实例我使用官方的例子,SoundPlayer类和SoundPlayerConsumer消费者类。下面部分文件的内容参考上篇文章React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟)src/lib/sound-player.js

export default class SoundPlayer {
  constructor() {
    this.name = 'Player1';
    this.fileName = '';
  }

  choicePlaySoundFile(fileName) {
    this.fileName = fileName;
  }

  playSoundFile() {
    console.log('播放的文件是:', this.fileName);
  }
}


src/lib/sound-player-consumer.js

import SoundPlayer from './sound-player';

export default class SoundPlayerConsumer {
  constructor() {
    this.soundPlayer = new SoundPlayer();
  }

  play() {
    const coolSoundFileName = 'song.mp3';
    this.soundPlayer.choicePlaySoundFile(coolSoundFileName);
    this.soundPlayer.playSoundFile();
  }
}

通过在__mocks__文件夹中创建一个模拟实现来创建手动模拟。
这个可以指定实现,并且可以通过测试文件使用它。如下
src/lib/__mocks__/sound-player.js

export const mockChoicePlaySoundFile = jest.fn();
const mockPlaySoundFile = jest.fn();

const mock = jest.fn().mockImplementation(() => {
  const data = {
    choicePlaySoundFile: mockChoicePlaySoundFile,
    playSoundFile: mockPlaySoundFile,
  };

  return data;
});

export default mock;

然后在测试用例中导入mock和mock方法,具体如下

import SoundPlayer, { mockChoicePlaySoundFile } from '../lib/sound-player';
import SoundPlayerConsumer from '../lib/sound-player-consumer';

jest.mock('../lib/sound-player'); // SoundPlayer 现在是一个模拟构造函数

beforeEach(() => {
  // 清除所有实例并调用构造函数和所有方法:
  SoundPlayer.mockClear();
  mockChoicePlaySoundFile.mockClear();
});

it('我们可以检查SoundPlayerConsumer是否调用了类构造函数', () => {
  const soundPlayerConsumer = new SoundPlayerConsumer();
  expect(SoundPlayer).toHaveBeenCalledTimes(1);
});

it('我们可以检查SoundPlayerConsumer是否在类实例上调用了一个方法', () => {
  const soundPlayerConsumer = new SoundPlayerConsumer();
  const coolSoundFileName = 'song.mp3';
  soundPlayerConsumer.play();
  expect(mockChoicePlaySoundFile).toHaveBeenCalledWith(coolSoundFileName);
});


运行后得到的结果如下

 PASS  src/__tests__/jest_sound_player_2.test.js
   我们可以检查SoundPlayerConsumer是否调用了类构造函数 (7ms)
   我们可以检查SoundPlayerConsumer是否在类实例上调用了一个方法 (2ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        3.352s
Ran all test suites matching /src\/__tests__\/jest_sound_player_2.test.js/i.

下次介绍第三、四种方法 - 使用模块工厂参数调用jest.mock()(Calling jest.mock() with the module factory parameter)和使用mockImplementation()或mockImplementationOnce()替换mock(Replacing the mock using mockImplementation() or mockImplementationOnce())

实践项目地址

git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git
git checkout v_1.0.31

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
全网最细:Jest+Enzyme测试React组件(包含交互、DOM、样式测试)
Jest是目前前端工程化下单元测试火热的技术栈,而Enzyme的支持提供了Jest测试React业务、组件的能力,下面来介绍一下React组件测试的一些实际场景。
16 0
react生态下jest单元测试
react生态下jest单元测试
1742 0
React 16 Jest ES6级模拟 - 与MongoDB一起使用
转载地址 React 16 Jest ES6级模拟 - 与MongoDB一起使用 项目初始化 git clone https://github.
1319 0
React 16 Jest ES6级模拟 - 监视并监视模拟情况
转载地址 React 16 Jest ES6级模拟 - 监视并监视模拟情况 项目初始化 git clone https://github.
989 0
React 16 Jest ES6级模拟 - 深入:了解模拟构造函数
转载地址 React 16 Jest ES6级模拟 - 深入:了解模拟构造函数 项目初始化 git clone https://github.
1062 0
React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四
转载地址 React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四 项目初始化 git clone https://github.
1315 0
React 16 Jest使用ES模块导入和模拟JSDOM中未实现的方法
转载 React 16 Jest使用ES模块导入和模拟JSDOM中未实现的方法 项目初始化 git clone https://github.
1325 0
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-demo git fetch origin git checkout v_1.0.27 npm install   手动模拟(Manual Mocks) 手动模拟主要功能是用于存储模拟的数据。
1237 0
React 16 Jest定时器模拟 Timer Mocks
转载 React 16 Jest定时器模拟 Timer Mocks 项目初始化 git clone https://github.
1380 0
React 16 Jest如何进行异步程序测试
转载地址 React 16 Jest如何进行异步程序测试 项目初始化 git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git  cd webpack4-react16-reactrouter-demo git fetch origin git checkout v_1.0.25 npm install 异步程序测试 首先,在Jest中启用Babel支。
1140 0
+关注
durban
无风不起浪,浪起来
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
React在大型后台管理项目中的工程实践
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多