import React from 'react'

const Release = React.createClass({
render() {
const { title, artist, outOfPrint } = this.props.release;
const className = outOfPrint? 'release outOfPrint' : 'release';
return (
<tr className={className} >
<td className="artist">{ artist }</td>
<td className="title">{ title }</td>
<td className="comment">{ outOfPrint ? <span style={{color: 'red', fontStyle: 'italic'}}>Out Of Print!</span> : null }</td>
</tr>
);
}
}); const ReleaseTable = React.createClass({
render() {
const { searchText, releases, noOutOfPrint } = this.props;
const rows = releases.filter((release) => {
return (release.title.indexOf(searchText) !== -1
|| release.artist.indexOf(searchText) !== -1)
&& !(release.outOfPrint && noOutOfPrint);
}); return (
<table className="releaseTable">
<thead>
<tr>
<th>Artist</th>
<th>Title</th>
<th>Comment</th>
</tr>
</thead>
<tbody>{rows.map(release => {
return <Release release={ release }
key={ release.title } />
})}</tbody>
</table>
);
}
}); const SearchBar = React.createClass({
updateSearch() {
this.props.onSearch(
this.refs.search.value,
this.refs.noOutOfPrint.checked
);
},
render() {
return (
<form className="searchBar">
<input
type="text"
placeholder="Search..."
value={this.props.searchText}
ref="search"
onChange={this.updateSearch}
id="searchFilter"
/>
<p>
<input
type="checkbox"
checked={this.props.noOutOfPrint}
ref="noOutOfPrint"
onChange={this.updateSearch}
id="noOutOfPrint"
/>
{' '}
Only show available releases
</p>
</form>
);
}
}); const Root = React.createClass({
getInitialState() {
return {
searchText: '',
noOutOfPrint: false
};
}, updateSearch: function (searchText, noOutOfPrint) {
this.setState({ searchText, noOutOfPrint });
}, render() {
return (
<div className="main">
<SearchBar
searchText={this.state.searchText}
inStockOnly={this.state.noOutOfPrint}
onSearch={this.updateSearch}
/>
<ReleaseTable
releases={this.props.releases}
searchText={this.state.searchText}
noOutOfPrint={this.state.noOutOfPrint}
/>
</div>
);
}
}); export {
Release,
ReleaseTable,
SearchBar
}; export default Root;
import React from 'react'
import { shallow, mount, render } from 'enzyme'
import Root, { SearchBar, ReleaseTable, Release } from '../src/Root' const createShallowRelease = (outOfPrint = true) => {
let props = {release: { artist: 'foobar', title: 'bar', outOfPrint }};
return shallow(<Release {...props} />);
}; const createShallowRelaseTable = (noOutOfPrint = false, searchText = '') => {
let items = [{ artist: 'foobar', title: 'bar', outOfPrint: true }];
let props = { searchText, releases: items, noOutOfPrint };
return shallow(<ReleaseTable { ...props } />);
} describe('<SearchBar>', () => { let onSearch;
beforeEach(() => {
onSearch = jasmine.createSpy('onSearch');
}); it('calls onSearch when search text changes', () => {
let props = { searchText: '', noOutOfPrint: false, onSearch };
let search = mount(<SearchBar { ...props } />);
let input = search.find('#searchFilter');
input.get(0).value = 'foobar';
input.simulate('change');
expect(onSearch).toHaveBeenCalledWith('foobar', false);
}); it('calls onSearch when no out print is checked', () => {
let props = { searchText: '', noOutOfPrint: false, onSearch };
let search = mount(<SearchBar { ...props } />);
let input = search.find('#noOutOfPrint');
input.get(0).checked = true;
input.simulate('change', {target: { checked: true }});
expect(onSearch).toHaveBeenCalledWith('', true);
}); }); describe('<ReleaseTable>', () => {
it('contains the class name releaseTable', () => {
let release = createShallowRelaseTable();
expect(release.is('.releaseTable')).toBeTruthy();
}); it('renders release item', () => {
let release = createShallowRelaseTable();
expect(release.find(Release).length).toBe(1);
}); it('filters out any out of print items', () => {
let release = createShallowRelaseTable(true, '');
expect(release.find(Release).length).toBe(0);
}); it('filters out any out of items when filtering by search text', () => {
let release = createShallowRelaseTable(false, 'bla');
expect(release.find(Release).length).toBe(0);
}); }); describe('<Release>', () => {
it('contains the class name release', () => {
let release = createShallowRelease();
expect(release.is('.release')).toBeTruthy();
}); it ('contains the class name outOfPrint if out of print', () => {
let release = createShallowRelease(true);
expect(release.is('.outOfPrint')).toBeTruthy();
}); it ('does not contain the class name outOfPrint if available', () => {
let release = createShallowRelease(false);
expect(release.is('.outOfPrint')).toBeFalsy();
}); it ('renders the artist name', () => {
let release = createShallowRelease();
expect(release.find('.artist').text()).toEqual('foobar');
}); it ('renders the release title', () => {
let release = createShallowRelease();
expect(release.find('.title').text()).toEqual('bar');
}); it ('renders the correct comment', () => {
let release = createShallowRelease(true);
expect(release.find('.comment').text()).toEqual('Out Of Print!');
}); });
{
"name": "example-karma-jasmine-webapck-test-setup",
"description": "React Test Setup with Karma/Jasmine/Webpack",
"scripts": {
"test": "karma start --single-run --browsers PhantomJS"
},
"devDependencies": {
"babel": "^6.5.2",
"babel-core": "^6.5.2",
"babel-eslint": "^5.0.0",
"babel-loader": "^6.2.3",
"babel-preset-airbnb": "^1.1.1",
"babel-preset-es2015": "^6.5.0",
"babel-preset-react": "^6.5.0",
"enzyme": "^2.0.0",
"jasmine-core": "^2.4.1",
"json-loader": "^0.5.4",
"karma": "^0.13.21",
"karma-babel-preprocessor": "^6.0.1",
"karma-jasmine": "^0.3.7",
"karma-phantomjs-launcher": "^1.0.0",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^1.7.0",
"lodash": "^4.5.1",
"phantomjs-prebuilt": "^2.1.4",
"react": "^0.14.7",
"react-addons-test-utils": "^0.14.7",
"react-dom": "^0.14.7",
"react-test-utils": "0.0.1",
"webpack": "^1.12.14"
}
}

[React Unit Testing] React unit testing demo的更多相关文章

  1. [React & Testing] Simulate Event testing

    Here we want to test a toggle button component, when the button was click, state should change, styl ...

  2. Unit Testing, Integration Testing and Functional Testing

    转载自:https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional- ...

  3. angular开发者吐槽react+redux的复杂:“一个demo证明你的开发效率低下”

    曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular开发者,我来吐槽一下react+redux的复杂. 例子 为了让大家看得舒服,我用最简单的一个demo来展示r ...

  4. 【温故知新】—— React/Redux/React-router4基础知识&独立团Demo

    前言:React专注View层,一切皆组件:全部使用ES6语法,最新版本为React16. Redux是专注于状态管理的库,和react解耦:单一状态,单向数据流.[独立团github地址] 一.Re ...

  5. 【React入门】React父子组件传值demo

    公司一直是前后端分离的,最近集团开始推进中后台可视化开发组件(基于React封装),跟师兄聊起来也听说最近对后台开发人员的前端能力也是越来越重视了.所以作为一名后端,了解下前端的框架对自己也是大有好处 ...

  6. 【react】关于react框架使用的一些细节要点的思考

    ( _(:3 」∠)_给园友们提个建议,无论是API文档还是书籍,一定要多看几遍!特别是隔一段时间后,会有意想不到的收获的)   这篇文章主要是写关于学习react中的一些自己的思考:   1.set ...

  7. 【React Native】React Native项目设计与知识点分享

    闲暇之余,写了一个React Native的demo,可以作为大家的入门学习参考. GitHub:https://github.com/xujianfu/ElmApp.git GitHub:https ...

  8. Difference Between Performance Testing, Load Testing and Stress Testing

    http://www.softwaretestinghelp.com/what-is-performance-testing-load-testing-stress-testing/ Differen ...

  9. react系列从零开始-react介绍

    react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到w ...

随机推荐

  1. php中ajax使用实例

    php中ajax使用实例 一.总结 1.多复习:这两段代码都挺简单的,就是需要复习,要多看 2.ajax原理:ajax就是部分更新页面,其实还在的html页面监听到事件后,然后传给服务器进行操作,这里 ...

  2. sql跳过非工作日(周末和节假日)

    简介:场景1:基于开始日期和工期,推算结束日期. 场景2:基于开始日期和结束日期,计算工期 注:需要自己做界面维护工作日表(s_WorkDay)和节假日表(s_SpecialDay) 涉及到的数据表 ...

  3. android组件

    SlidingDrawer http://www.cnblogs.com/renyuan/archive/2012/09/16/2687929.html autocompletetextview  / ...

  4. Maven学习笔记5

    Web项目的部署: web部署 配置步骤 生成项目方式不是quickstart,而是webapp. 默认目录结构,需要修改配置. 重新配置project facets和java compiler.并重 ...

  5. 洛谷 P1893 山峰暸望

    P1893 山峰暸望 题目描述 一天,Bessie在眺望美丽的威斯康星的群山的时候,她突然产生了疑问:那座山是最宽的? 她决定在地平线上,利用她的新式大量程山峰高度测量仪依次做N (1 <= N ...

  6. 6.在单机上实现ZooKeeper伪机群/伪集群部署

    转自:https://blog.csdn.net/poechant/article/details/6633923

  7. 【前端图表】echarts散点图鼠标划过散点显示信息

    在做项目的过程中,总会遇到这样或者那样的bug,这个时候就要看自己的动手能力有多强了,着手解决了一个bug之后,整个人都感觉很开心,端午下班之前遇到了一个小问题,echarts散点图鼠标划过散点的时候 ...

  8. VC++ 6.0 BUG BUG BUG BUG BUG

    http://blog.163.com/amao831@126/blog/#m=0 我经常在的VC++6.0中 定义某个类的对象时 再用.访问或者->访问时不自动弹出他的成员函数或者成员变量 最 ...

  9. Javascript和jquery事件--双击事件

    在js中和jq中对应的命名都为dblclick,ondblclick,但是ondblclick和dom元素的属性相似,可以在行内设置,也可以使用attr设置. 同时,双击事件需要关注一个问题,那就是双 ...

  10. POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

    POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...