欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

React 16 Jest ES6级模拟之模拟构造函数的深入了解

程序员文章站 2022-06-11 15:46:53
react 16 jest es6级模拟之模拟构造函数的深入了解 项目初始化 git clone https://github.com/durban89/webpack4-...

react 16 jest 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.32
npm install

es6 class mocks(使用es6语法类的模拟)

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

es6语法的类是具有一些语法糖的构造函数。因此,es6语法的类的任何模拟都必须是函数或实际的es6语法的类(这也是另一个函数)。

所以可以使用模拟函数来模拟它们。如下

深入:了解模拟构造函数

使用jest.fn().mockimplementation()构建的构造函数mock,使模拟看起来比实际更复杂。

那么jest是如何创建一个简单的模拟(simple mocks)并演示下mocking是如何起作用的

手动模拟另一个es6语法的类

如果使用与__mocks__文件夹中的模拟类相同的文件名定义es6语法的类,则它将用作模拟。

这个类将用于代替真正的类。

我们可以为这个类注入测试实现,但不提供监视调用的方法。如下

src/__mocks__/sound-player.js

export default class soundplayer {
 constructor() {
  console.log('mock soundplayer: constructor was called');
  this.name = 'player1';
  this.filename = '';
 }

 choiceplaysoundfile(filename) {
  console.log('mock soundplayer: choiceplaysoundfile was called');
  this.filename = filename;
 }

 playsoundfile() {
  console.log('mock soundplayer: playsoundfile was called');
  console.log('播放的文件是:', this.filename);
 }
}

使用模块工厂参数的简单模拟(simple mock using module factory parameter)

传递给jest.mock(path,modulefactory)的模块工厂函数可以是返回函数*的高阶函数(hof)。

这将允许在模拟上调用new。

同样,这允许为测试注入不同的行为,但不提供监视调用的方法

*模块工厂功能必须返回一个功能(* module factory function must return a function)

为了模拟构造函数,模块工厂必须返回构造函数。

换句话说,模块工厂必须是返回函数的函数 - 高阶函数(hof)。如下演示

jest.mock('../lib/sound-player', () => {
 return function() {
  return {
   playsoundfile: () => {}
  };
 };
});

注意:箭头功能不起作用(note: arrow functions won't work)

请注意,mock不能是箭头函数,因为在javascript中不允许在箭头函数上调用new。

所以这不起作用:

jest.mock('./sound-player', () => {
 return () => {
  // 不起作用 箭头函数不会被调用
  return {playsoundfile: () => {}};
 };
});

这将抛出typeerror:_soundplayer2.default不是构造函数,除非代码被转换为es5,例如,

通过babel-preset-env。(es5没有箭头函数也没有类,因此两者都将被转换为普通函数。)

实践项目地址

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