Enzyme是一个用于React的JavaScript测试实用程序,它使得更容易断言,操作和遍历您的React组件的输出,它模拟了jQuery的API,非常直观,易于使用和学习。

整理相当API为中文,所以资料都是官方API翻译而已,代码块以最新的粘贴过来

它提供三种测试方法:

  • shallow
  • render
  • mount

先解释一个词:wrapper wrapper是enzyme包装好的类,以供api使用

shallow方法

shallow 在单元测试的过程中,浅渲染将一个组件渲染成虚拟DOM对象,并不会渲染其内部的子组件,也不是真正完整的React Render,无法与子组件互动。

以下shallow浅层渲染代码案例

 
 
 
 

JavaScript

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import React from 'react';
import { expect } from 'chai';
import { shallow } from 'enzyme';
import sinon from 'sinon';
 
import MyComponent from './MyComponent';
import Foo from './Foo';
 
describe('<MyComponent />', () => {
  it('renders three <Foo /> components', () => {
    const wrapper = shallow(<MyComponent />);
    expect(wrapper.find(Foo)).to.have.lengthOf(3);
  });
 
  it('renders an `.icon-star`', () => {
    const wrapper = shallow(<MyComponent />);
    expect(wrapper.find('.icon-star')).to.have.lengthOf(1);
  });
 
  it('renders children when passed in', () => {
    const wrapper = shallow((
      <MyComponent>
        <div className="unique" />
      </MyComponent>
    ));
    expect(wrapper.contains(<div className="unique" />)).to.equal(true);
  });
 
  it('simulates click events', () => {
    const onButtonClick = sinon.spy();
    const wrapper = shallow(<Foo onButtonClick={onButtonClick} />);
    wrapper.find('button').simulate('click');
    expect(onButtonClick).to.have.property('callCount', 1);
  });
});

render方法介绍

render静态渲染API,使用enzyme's 的render函数从React树生成HTML,并分析生成的HTML结构。render返回包装非常类似于在enzyme's的其它渲染器,render使用第三方HTML解析和遍历库 Cheerio。我们相信Cheerio非常好地处理HTML的解析和遍历,并且自己复制这个功能

 
 
 
 

JavaScript

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React from 'react';
import { expect } from 'chai';
import { render } from 'enzyme';
 
import Foo from './Foo';
 
describe('<Foo />', () => {
  it('renders three `.foo-bar`s', () => {
    const wrapper = render(<Foo />);
    expect(wrapper.find('.foo-bar')).to.have.lengthOf(3);
  });
 
  it('renders the title', () => {
    const wrapper = render(<Foo title="unique" />);
    expect(wrapper.text()).to.contain('unique');
  });
});

mount方法介绍

mount完整的DOM渲染非常适用于组件可能与DOM API交互或需要测试包含在更高阶组件中的组件的情况。

完整DOM渲染要求在全局范围内提供完整的DOM API。这意味着它必须在至少“看起来像”浏览器环境的环境中运行。如果您不想在浏览器中运行测试,推荐的使用方法mount是依赖于一个名为jsdom的库,它本质上是一个完全用JS实现的无头浏览器。

注意:与浅层或静态渲染不同,完全渲染实际上将组件安装在DOM中,这意味着如果测试全部使用相同的DOM,则测试可以相互影响。在编写测试时请记住这一点,并在必要时使用.unmount()或类似清理。

 

以下render完整的DOM渲染案例

 
 
 
 

JavaScript

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import React from 'react';
import sinon from 'sinon';
import { expect } from 'chai';
import { mount } from 'enzyme';
 
import Foo from './Foo';
 
describe('<Foo />', () => {
  it('allows us to set props', () => {
    const wrapper = mount(<Foo bar="baz" />);
    expect(wrapper.props().bar).to.equal('baz');
    wrapper.setProps({ bar: 'foo' });
    expect(wrapper.props().bar).to.equal('foo');
  });
 
  it('simulates click events', () => {
    const onButtonClick = sinon.spy();
    const wrapper = mount((
      <Foo onButtonClick={onButtonClick} />
    ));
    wrapper.find('button').simulate('click');
    expect(onButtonClick).to.have.property('callCount', 1);
  });
 
  it('calls componentDidMount', () => {
    sinon.spy(Foo.prototype, 'componentDidMount');
    const wrapper = mount(<Foo />);
    expect(Foo.prototype.componentDidMount).to.have.property('callCount', 1);
    Foo.prototype.componentDidMount.restore();
  });
});

shallow(node[, options]) => ShallowWrapper

参数

  1. node (ReactElement): 要渲染的组件
  2. options (Object [optional]):
  3. options.context: (Object [optional]): 要传递到组件的上下文

返回

ShallowWrapper: 在渲染输出后,返回浅渲染ShallowWrapper实例

ShallowWrapper API

.at(index) => ShallowWrapper

返回当前索引的的节点到 wrapper 在当前包装器的给定索引处返回节点周围的包装器。

参数

  • index (Number): 从0开始的整数,来选择取回的第几个节点

返回

ShallowWrapper

例子

 
 
1
2
const wrapper = shallow(<MyComponent />);
expect(wrapper.find(Foo).at(0).props().foo).to.equal("bar");

类似方法 .get(index) => ReactElement

.childAt(index) => ShallowWrapper

返回具有指定索引的子元素到新的wrapper

.find(selector) => ShallowWrapper

根据选择器,找到渲染树中的节点。

.findWhere(predicate) => ShallowWrapper

找到渲染树中里被的断言函数返回true的节点 参数:predicate (ShallowWrapper => Boolean) 断言函数返回布尔值

.filter(selector) => ShallowWrapper

过滤当前包装器中与所提供的选择器不匹配的节点。

.filterWhere(predicate) => ShallowWrapper

过滤当前包装器里被断言函数predicate不返回true的节点

.contains(nodeOrNodes) => Boolean

返回给定的 节点/节点数组 是否在渲染树中的布尔值。

.containsMatchingElement(node) => Boolean

返回在浅渲染树中是否存在给定的node节点 的布尔值。

.containsAllMatchingElements(nodes) => Boolean

返回在浅渲染树中是否存在给定的 所有 react元素 的布尔值。

.containsAnyMatchingElements(nodes) => Boolean

返回在浅渲染树中是否存在给定react元素 之一 的布尔值

.equals(node) => Boolean

根据期望值,返回当前渲染树是否等于给定节点的 布尔值

.matchesElement(node) => Boolean

返回当前给定的react元素 是否 匹配浅渲染树 的布尔值

.hasClass(className) => Boolean

是否有这个className

.is(selector) => Boolean

当前节点是否与提供的选择器匹配

.exists() => Boolean

当前节点是否存在

.isEmpty() => Boolean

弃用: 用 .exists() 代替.

.not(selector) => ShallowWrapper

删除当前wrapper中与所提供的选择器匹配的节点。 (与 .filter()作用相反)

.children() => ShallowWrapper

获取当前 wrapper 中所有子节点的 wrapper.

.childAt(index) => ShallowWrapper

返回具有指定索引的子元素的 wrapper

.parents() => ShallowWrapper

获取当前节点的所有父级(祖先)

.parent() => ShallowWrapper

获取当前节点的直接父级

.closest(selector) => ShallowWrapper

根据选择器,获取当前节点的第一个祖先

Get a wrapper with the first ancestor of the current node to match the provided selector.

.shallow([options]) => ShallowWrapper

Shallow renders the current node and returns a shallow wrapper around it.

.render() => CheerioWrapper

返回当前节点的子树的CheerioWrapper

.unmount() => ShallowWrapper

卸载组件的方法

.text() => String

返回当前渲染树中文本节点的 字符串表示形式。

.html() => String

返回当前节点的静态HTML呈现

.get(index) => ReactElement

返回给出索引的节点 ReactElement

.getNode() => ReactElement

返回底层节点

.getNodes() => Array<ReactElement>

返回底层的一些节点

.at(index) => ShallowWrapper

返回 参数:索引节点的 浅wrapper。

.first() => ShallowWrapper

返回当前第一个节点 wrapper

.last() => ShallowWrapper

返回当前最后一个节点 wrapper

.state([key]) => Any

返回根组件的状态

.context([key]) => Any

返回根组件的上下文环境

.props() => Object

返回当前节点的 props

.prop(key) => Any

返回当前节点props的某个(key)属性的值

.key() => String

返回当前节点的键(key)

.simulate(event[, data]) => ShallowWrapper

模拟当前节点上的事件

.setState(nextState) => ShallowWrapper

手动setState更新根组件状态

.setProps(nextProps) => ShallowWrapper

手动更新根组件的props

.setContext(context) => ShallowWrapper

手动设置根组件的上下文

.instance() => ReactComponent

返回根组件的实例

.update() => ShallowWrapper

在根组件实例上调用.forceUpdate()

.debug() => String

返回当前浅渲染树的字符串表示形式,以便进行调试

.type() => String|Function

返回包装器(wapper)的当前节点的类型。

.name() => String

返回当前节点的名称

.forEach(fn) => ShallowWrapper

迭代当前的每个节点并执行提供的函数

.map(fn) => Array

将当前的节点数组映射到另一个数组

.reduce(fn[, initialValue]) => Any

将当前节点数组减少为一个值

.reduceRight(fn[, initialValue]) => Any

将当前节点数组从右到左减少为一个值 Reduces the current array of nodes to a value, from right to left.

.slice([begin[, end]]) => ShallowWrapper

根据Array#slice的规则返回具有原始包装器的节点的子集的新包装器。

.tap(intercepter) => Self

点击wrapper方法链。有助于调试。 Taps into the wrapper method chain. Helpful for debugging.

.some(selector) => Boolean

返回 是否有 节点与提供的选择器匹配。

.someWhere(predicate) => Boolean

返回 是否有 节点 传递所提供的断言函数。

.every(selector) => Boolean

返回 是否 有节点与提供的选择器匹配。

.everyWhere(predicate) => Boolean

返回 是否 所有 节点都传递所提供的断言函数。

.dive([options]) => ShallowWrapper

浅渲染当前wrapper的一个非DOM子元素,并在结果周围返回一个wrapper

exspect(运行结果).toBe(期望的结果);
//常见断言方法
expect({a:1}).toBe({a:1})//判断两个对象是否相等
expect(1).not.toBe(2)//判断不等
expect({ a: 1, foo: { b: 2 } }).toEqual({ a: 1, foo: { b: 2 } })
expect(n).toBeNull(); //判断是否为null
expect(n).toBeUndefined(); //判断是否为undefined
expect(n).toBeDefined(); //判断结果与toBeUndefined相反
expect(n).toBeTruthy(); //判断结果为true
expect(n).toBeFalsy(); //判断结果为false
expect(value).toBeGreaterThan(3); //大于3
expect(value).toBeGreaterThanOrEqual(3.5); //大于等于3.5
expect(value).toBeLessThan(5); //小于5
expect(value).toBeLessThanOrEqual(4.5); //小于等于4.5
expect(value).toBeCloseTo(0.3); // 浮点数判断相等
expect('Christoph').toMatch(/stop/); //正则表达式判断
expect(['one','two']).toContain('one'); //不解释


https://blog.csdn.net/F_Felix/article/details/118275875

enzyme文档的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  6. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  7. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  8. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

  9. ABP文档 - Javascript Api

    文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...

  10. ABP文档 - 导航

    文档目录 本节内容: 创建菜单 注册导航供应器 显示菜单 每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户. 创建菜单 一个应用可能由不同模块组成 ...

随机推荐

  1. 【Vue】style和class 列表渲染 使用v-for进行循环 监控失效 双向数据绑定 过滤案例 事件修饰符

    目录 昨日回顾 style和class class属性的三种设置方法 style属性的三种设置方法 条件渲染 列表渲染 使用v-for进行循环 循环数字 循环字符串 循环对象 循环数组 标签key值加 ...

  2. springboot如何在拦截器中拦截post请求参数以及解决文件类型上传问题

      我们经常有这样一个场景,比如:在springboot拦截器中想截取post请求的body参数做一些中间处理,或者用到自定义注解,想拦截一些特定post请求的方法的参数,记录一些请求日志. 想到了使 ...

  3. 安装和配置Java开发环境JDK

    我们通常软件开发的操作系统选择Windows,生产环境选择linux或windows Server.移动开发可能是安卓或IOS和鸿蒙系统等. Windows下一般选择的是64位的操作系统,一般建议CP ...

  4. vue3语法糖+ts组件传值

    在开发中有些功能是通用的,而且逻辑大致相同,像这种东西可以封成一个组件,比较常用的就是函数封装,组件封装,组件封装是需要引入到页面使用的,所以通常它会有一些自己的方法,父子组件可以通过一些值来进行关联 ...

  5. 【译】.NET 7 中的性能改进(三)

    原文 | Stephen Toub 翻译 | 郑子铭 PGO 我在我的 .NET 6 性能改进一文中写了关于配置文件引导优化 (profile-guided optimization) (PGO) 的 ...

  6. 解决.Net Core3.0 修改cshtml代码之后必须重新生成才可以看到效果

    1.安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包 2.在Startup中ConfigureServices方法里面加入services.Ad ...

  7. ajax请求头添加参数

    在请求ajax时 ,有时后台要求在请求头里边上参数 ,这种情况下一般都是在原生APP项目当中,因为要在登录状态下才,所有要传token和登录id, var token = localStorage.g ...

  8. zint

    一.Zint1. 介绍 Zint是一个软件,允许在任何广泛的公共领域条形码标准中轻松编码数据,并允许将这种功能集成到您自己的程序中. Zint项目的目标是提供一个完全跨平台的开源条形码生成解决方案,目 ...

  9. ABAP 拼接PDF

    参考标准程序RSPO_TEST_MERGE_PDF_FILES*--合并PDF data: pdf_merger type ref to cl_rspo_pdf_merge. data: ex typ ...

  10. RISC-V核及工具链整理

    RISC-V开源核分为开源核(无外设).SOC.FPGA.多核等多种框架. 开源核 SOC框架 平头哥无剑100 包括EDA仿真框架及FPGA框架 https://github.com/T-head- ...