[React & Testing] Simulate Event testing
Here we want to test a toggle button component, when the button was click, state should change, style should change also.
Toggle component:
- // see this live: https://codesandbox.io/s/GvWpGjKQ
- import React, {Component} from 'react'
- import PropTypes from 'prop-types'
- import glamorous from 'glamorous'
- import {darken} from 'polished'
- // imagine this is in a "components" file
- const primaryColor = '#337ab7'
- const toggledOnStyles = {
- backgroundColor: darken(0.15, primaryColor),
- borderColor: darken(0.25, primaryColor),
- '&:hover,&:active,&:focus': {
- backgroundColor: darken(0.2, primaryColor),
- borderColor: darken(0.3, primaryColor),
- },
- }
- const toggledOffStyles = {
- backgroundColor: primaryColor,
- borderColor: darken(0.1, primaryColor),
- '&:hover,&:active,&:focus': {
- backgroundColor: darken(0.1, primaryColor),
- borderColor: darken(0.2, primaryColor),
- },
- }
- const ToggleButton = glamorous.button(
- {
- display: 'inline-block',
- padding: '6px 12px',
- marginBottom: '0',
- fontSize: '14px',
- fontWeight: '400',
- lineHeight: '1.4',
- textAlign: 'center',
- cursor: 'pointer',
- borderRadius: '4px',
- color: '#fff',
- },
- props => (props.on ? toggledOnStyles : toggledOffStyles),
- )
- class Toggle extends Component {
- constructor(props, ...rest) {
- super(props, ...rest)
- this.state = {
- toggledOn: props.initialToggledOn || false,
- }
- }
- handleToggleClick = () => {
- const toggledOn = !this.state.toggledOn
- this.props.onToggle(toggledOn)
- this.setState({toggledOn})
- }
- render() {
- const {children} = this.props
- const {toggledOn} = this.state
- return (
- <ToggleButton
- on={toggledOn}
- onClick={this.handleToggleClick}
- data-test="button"
- >
- {children}
- </ToggleButton>
- )
- }
- }
- Toggle.propTypes = {
- initialToggledOn: PropTypes.bool,
- onToggle: PropTypes.func.isRequired,
- children: PropTypes.any.isRequired,
- }
- export default Toggle
Test:
- import React from 'react'
- import {render, mount} from 'enzyme'
- import Toggle from '../toggle'
- test('component render with default state', () => {
- const wrapper = renderToggle();
- expect(wrapper).toMatchSnapshotWithGlamor();
- })
- test('when button is clicked, the style of button should change', () => {
- const onToggle = jest.fn() // jest mock function
- const wrapper = mountToggle({
- onToggle
- })
- // It is recommended that for the element we need to test
- // we can add 'data-test' attr, so that we can reference
- // the element inside testing
- const button = wrapper.find('[data-test="button"]')
- // we can verify the style changes inside snapshots
- expect(wrapper).toMatchSnapshotWithGlamor('1. Before toggle')
- button.simulate('click')
- expect(wrapper).toMatchSnapshotWithGlamor('2. After toggle')
- })
- test('onToggle function should be called when the button is clicked', () => {
- const onToggle = jest.fn() // jest mock function
- const wrapper = mountToggle({
- onToggle
- })
- // It is recommended that for the element we need to test
- // we can add 'data-test' attr, so that we can reference
- // the element inside testing
- const button = wrapper.find('[data-test="button"]')
- button.simulate('click')
- expect(onToggle).toHaveBeenCalledTimes(1)
- expect(onToggle).toHaveBeenCalledWith(true)
- })
- /**
- * The difference between mount and render function is that
- * 1. render is faster, because after rendered, it output string,
- * so there is no lifecycle hooks bind with it.
- * 2. mount, on the other hand, will bind lifecycle hooks and events,
- * the output is actual DOM element
- * */
- function mountToggle(props = {}) {
- const propToUse = Object.assign(
- {},
- {
- onToggle() {
- },
- children: 'I am a child'
- },
- props
- )
- return mount(<Toggle {...propToUse} />)
- }
- function renderToggle(props = {}) {
- const propToUse = Object.assign(
- {},
- {
- onToggle() {
- },
- children: 'I am a child'
- },
- props
- )
- return render(<Toggle {...propToUse} />)
- }
[React & Testing] Simulate Event testing的更多相关文章
- Unit Testing, Integration Testing and Functional Testing
转载自:https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional- ...
- Difference Between Performance Testing, Load Testing and Stress Testing
http://www.softwaretestinghelp.com/what-is-performance-testing-load-testing-stress-testing/ Differen ...
- Go testing 库 testing.T 和 testing.B 简介
testing.T 判定失败接口 Fail 失败继续 FailNow 失败终止 打印信息接口 Log 数据流 (cout 类似) Logf format (printf 类似) SkipNow 跳过当 ...
- [AngularJS Unit tesint] Testing keyboard event
HTML: <div ng-focus="vm.onFocus(month)", aria-focus="{{vm.focus == month}}", ...
- [Unit Testing] AngularJS Unit Testing - Karma
Install Karam: npm install -g karma npm install -g karma-cli Init Karam: karma init First test: 1. A ...
- Penetration Testing、Security Testing、Automation Testing
相关学习资料 http://www.cnblogs.com/LittleHann/p/3823513.html http://www.cnblogs.com/LittleHann/p/3828927. ...
- 测试理论--branch testing and boundary testing
1 branch testing 分支测试 测试代码的所有分支 2 boundary testing 测试 程序的限制条件
- [Unit Testing] Fundamentals of Testing in Javascript
In this lesson, we’ll get the most fundamental understanding of what an automated test is in JavaScr ...
- [Angular Unit Testing] Debug unit testing -- component rendering
If sometime you want to log out the comonent html to see whether the html render correctly, you can ...
随机推荐
- STL使用————SET&MULTISET
SET函数的基本用法 by hhl 使用set的好处 1. 当增加元素后,集合会自动删重并从小到大排列(时间比快排还快)2. 相当于一棵伸展树(能快速求出后继) 使用基础 #include<se ...
- Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)
Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...
- 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)
static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .
- Safe and efficient allocation of memory
Aspects of the present invention are directed at centrally managing the allocation of memory to exec ...
- 洛谷 P1994 有机物燃烧
P1994 有机物燃烧 题目背景 本来准备弄难点的,还是算了吧 题目描述 输入一种有机物,输出与氧气反应化学方程式中CO2和H2O的系数 输入输出格式 输入格式: 一行,一个字符串,表示有机物 输出格 ...
- 比MD5 和HMAC还要安全的加密 - MD5 加时间戳
//1.给一个字符串进行MD5加密 NSString *passKey = @"myapp"; passKey = [passKey md5String]; //2.对第一步中得到 ...
- h5播放音乐
h5音频播放,里面參数能够查看http://www.w3school.com.cn/html5/html_5_audio.asp <audio controls="controls&q ...
- 41.Node.js使用cnpm
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html npm是Node.js中维护第三方库.模块的工具,但是国外的速度很悲剧,这里有一个中国的源cn ...
- vue (v-if show 问题)
vue中的显示和隐藏有两种方式 1.v-if ( 相当于动态创建的标签,在html 结构中,是不存在的. ) 2. v-show(控制的是 html 的css display:none 属性.结 ...
- CDQZ 0003:jubeeeeeat
0003:jubeeeeeat 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是 ...