热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端单元测试入门3react测试

1.react测试体验1.1安装create-react-appreact-testcdreact-test1.2创建sum.jsmodule.exportsfunction(a,
1.react测试体验

1.1安装

create-react-app react-test
cd react-test

1.2 创建sum.js

module.exports = function(a,b){
return a+b;
}

1.3 创建sum.spec.js

let sum = require('./sum');
it('a+b',function(){
expect(sum(1,2)).toBe(3);
});

1.4 运行测试

npm test2.enzyme测试

《前端单元测试入门3-react测试》

  • Shallow Rendering(浅渲染)指的是,将一个组件渲染成虚拟DOM对象,但是只渲染第一层,不渲染所有子组件,所以处理速度非常快。它不需要DOM环境,因为根本没有加载进DOM
  • find()方法:只支持简单选择器 类选择器、id选择器、标签选择器、复合选择器

2.1 安装enzyme

npm i enzyme enzyme-adapter-react-16 -D

2.2 创建 TodoInput.js

import React, { Component } from 'react';
export default class TodoInput extends Component {
handleKeyDown = (event) => {
let code = event.keyCode;
if (code == 13) {
let text = event.target.value;
this.props.addTodo(text);
event.target.value = '';
}
}
addTodo = () => {
let text = this.todo.value;
this.props.addTodo(text);
this.todo.value = '';
}
render() {
return (


this.todo = input} OnKeyDown={this.handleKeyDown} />


)
}
}

2.3 创建 TodoInput.spec.js

import React from 'react';
import Enzyme,{shallow} from 'enzyme';
import TodoInput from './TodoInput';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({adapter:new Adapter()});
//http://airbnb.io/enzyme/docs/api/ShallowWrapper/find.html
//http://airbnb.io/enzyme/docs/api/selector.html
it('shoud render 请输入',function(){
const wrapper = shallow();
const h3 = wrapper.find('h3');
const input = wrapper.find('input');
expect(h3.text()).toBe('待办事项');
expect(input.props().defaultValue).toBe('请输入');
});

2.3 创建 TodoList.js

import React, { Component } from 'react';
import TodoItem from './TodoItem';
export default class TodoList extends Component {
render() {
return (


    {
    this.props.todos.map(todo => key={todo.id}
    todo={todo}
    delTodo={this.props.delTodo}
    toggleTodo={this.props.toggleTodo} />)
    }

)
}
}

2.4 点击事件

import React from 'react';
import Enzyme,{shallow} from 'enzyme';
import TodoInput from './TodoInput';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({adapter:new Adapter()});
//http://airbnb.io/enzyme/docs/api/ShallowWrapper/find.html
//http://airbnb.io/enzyme/docs/api/selector.html
describe('测试TodoInput',function(){
let todos;
beforeEach(()=>{
todos =[{text:'1'},{text:'2'}];
});
it('shoud render 请输入',function(){
let wrapper = shallow();
const h3 = wrapper.find('h3');
const input = wrapper.find('input');
expect(h3.text()).toBe('待办事项');
expect(input.props().defaultValue).toBe('请输入');
});
it('点击按钮的时候调用addTodo方法',function(){
let addTodo = jest.fn();
let wrapper = shallow();
let button = wrapper.find('button');
button.simulate('click');
expect(addTodo).toBeCalled();
});
});

2.5 TDD

  • TDD是测试驱动开发(Test-Driven Development)是敏捷开发中的一项核心实践和技术,也是一种设计方法论
  • TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码

创建reducer.js

const ADD_TODO = 'ADD_TODO';
const DEL_TODO = 'DEL_TODO';
let INIT_STATE = [{id:1,text:'1'},{id:2,text:'2'}];
function reducer(state=INIT_STATE,action={}){
switch(action.type){
case ADD_TODO:
return [...state,action.todo];
case DEL_TODO:
return state.filter(item=>item.id != action.id);
default:
return state;
}
}
module.exports = reducer;

创建reducer.spec.js

let reducer = require('./reducer');
const ADD_TODO = 'ADD_TODO';
const DEL_TODO = 'DEL_TODO';
describe('reducer',()=>{
let INIT_STATE = [{id:1,text:'1'},{id:2,text:'2'}];
it('初始状态',()=>{
expect(reducer(undefined,{})).toEqual(INIT_STATE);
});
it('增加todo',()=>{
let todos = reducer(INIT_STATE,{type:ADD_TODO,todo:{id:3,text:'3'}});
expect(todos).toEqual([...INIT_STATE,{id:3,text:'3'}]);
});
it('删除todo',()=>{
let todos = reducer(INIT_STATE,{type:DEL_TODO,id:2});
expect(todos).toEqual([{id:1,text:'1'}]);
});
});

2.6 测试点击事件

import React from 'react';
import Enzyme,{shallow} from 'enzyme';
import TodoItem from './TodoItem';
import Adapter from 'enzyme-adapter-react-16';
import { wrap } from 'module';
Enzyme.configure({adapter:new Adapter()});
//http://airbnb.io/enzyme/docs/api/ShallowWrapper/find.html
//http://airbnb.io/enzyme/docs/api/selector.html
describe('TodoItem',function(){
it('todo',()=>{
const wrapper = shallow();
expect(wrapper.text()).toMatch(/1/);
expect(wrapper.hasClass('todo')).toBe(true);
expect(wrapper.hasClass('todo-selected')).toBe(false);
});
it('todo-selected',()=>{
const wrapper = shallow();
expect(wrapper.text()).toMatch(/1/);
wrapper.simulate('click');
expect(wrapper.hasClass('todo')).toBe(false);
expect(wrapper.hasClass('todo-selected')).toBe(true);
});
});

2.7 mount

mount将React组件加载为真实的DOM

  • .get(index):返回指定位置的子组件的DOM节点
  • .at(index):返回指定位置的子组件
  • .text():返回当前组件的文本内容
  • .html():返回当前组件的HTML代码形式
  • .props():返回根组件的所有属性
  • .prop(key):返回根组件的指定属性
  • .state([key]):返回根组件的状态

import React from 'react';
import Enzyme,{mount} from 'enzyme';
import TodoApp from './TodoApp';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({adapter:new Adapter()});
describe('TodoApp',function(){
it('addTodo',()=>{
let wrapper = mount();
let len = wrapper.find('li').length;
wrapper.find('button').at(0).simulate('click');
expect(wrapper.find('li').length).toBe(len + 1);
});
it('delTodo',()=>{
let wrapper = mount();
let len = wrapper.find('li').length;
wrapper.find('button').at(1).simulate('click');
expect(wrapper.find('li').length).toBe(len - 1);
});
});

3. 参考

  • create-react-app
  • jest
  • expect
  • jest中文网
  • enzyme
  • Jasmine
  • istanbul
  • prop-types

推荐阅读
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 【前端工具】nodejs+npm+vue 安装(windows)
    预备先看看这几个是干嘛的,相互的关系是啥。nodejs是语言,类比到php。npm是个包管理,类比到composer。vue是个框架&# ... [详细]
author-avatar
手机用户2502933647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有