jest

jest是facebook推出的一款测试框架,集成了前面所讲的Mocha和chai,jsdom,sinon等功能。

安装与配置

  1. npm install --save-dev jest
  2. npm install -g jest

运行命令jest后会自动运行项目下所有.test.js和.spec.js这种格式的文件。

涉及到运用ES或react的,要与babel相结合,加上.babelrc文件即可,老玩法了。

jest的配置默认只需要在package.json中配置即可,当然也可以用独立的配置文件。

我们这里直接将jest的运行范围限定在test文件夹下,而不是全部,所以在package.json中加入如下配置:

  1. "jest": {
  2. "testRegex": "/test/.*.test.jsx?$"
  3. }

注意到这里的匹配规则是正则表达式

基本用法

和之前介绍的mocha和chai的功能很像,甚至可以兼容部分mocha和chai的语法。

可以这么写

  1. import React from 'react'
  2. import { shallow } from 'enzyme'
  3. import CommentItem from './commentItem'
  4. describe('测试评论列表项组件', () => {
  5. // 这是mocha的玩法,jest可以直接兼容
  6. it('测试评论内容小于等于200时不出现展开收起按钮', () => {
  7. const propsData = {
  8. date: '2018-03-04 10:10:11',
  9. name: '匿名人',
  10. content: '测试标题测试标题测试标题测试标题测试标题测试标题测试标题测试标题测试标题测试标题测试标题测试标题'
  11. }
  12. const item = shallow(<CommentItem {...propsData} />)
  13. //看到这里的断言了吗,实际上和chai的expect是很像的
  14. expect(item.find('.btn-expand').length).toBe(0);
  15. })
  16. // 这是jest的玩法,推荐用这种
  17. test('两数相加结果为两个数字的和', () => {
  18. expect(3).toBe(3);
  19. });
  20. }

jest与eslint检测

如果看了上面的代码会发现我没有引用任何类似于

  1. import * from 'jest'

的代码,而那个expect是没有定义的。

这段代码直接运行jest命令没有任何问题,但是eslint会检测出错,对于这种情况,我们可以再eslint配置文件.eslintrc中加入以下代码:

  1. "env": {
  2. "jest": true
  3. },

jest的断言

前面的章节介绍的断言库chai,jest有自己的断言玩法。

除了前面的代码中已经写到的

  1. expect(x).toBe(y)//判断相等,使用Object.is实现

还有常用的

  1. expect({a:1}).toBe({a:1})//判断两个对象是否相等
  2. expect(1).not.toBe(2)//判断不等
  3. expect(n).toBeNull();//判断是否为null
  4. expect(n).toBeUndefined();//判断是否为undefined
  5. expect(n).toBeDefined();//判断结果与toBeUndefined相反
  6. expect(n).toBeTruthy();//判断结果为true
  7. expect(n).toBeFalsy();//判断结果为false
  8. expect(value).toBeGreaterThan(3);//大于3
  9. expect(value).toBeGreaterThanOrEqual(3.5);//大于等于3.5
  10. expect(value).toBeLessThan(5);//小于5
  11. expect(value).toBeLessThanOrEqual(4.5);//小于等于4.5
  12. expect(value).toBeCloseTo(0.3); // 浮点数判断相等
  13. expect('Christoph').toMatch(/stop/);//正则表达式判断
  14. expect(['one','two']).toContain('one');//不解释
  15. function compileAndroidCode() {
  16. throw new ConfigError('you are using the wrong JDK');
  17. }
  18. test('compiling android goes as expected', () => {
  19. expect(compileAndroidCode).toThrow();
  20. expect(compileAndroidCode).toThrow(ConfigError);//判断抛出异常
  21. })

更多断言玩法

jest的mock

介绍了jest替代mocha和chai的部分,那么接下来就看看如何替代sinon。

下面是官网的示例:

  1. function forEach(items, callback) {
  2. for (let index = 0; index < items.length; index++) {
  3. callback(items[index]);
  4. }
  5. }
  6. const mockCallback = jest.fn();
  7. forEach([0, 1], mockCallback);
  8. // 判断是否被执行两次
  9. expect(mockCallback.mock.calls.length).toBe(2);
  10. // 判断函数被首次执行的第一个形参为0
  11. expect(mockCallback.mock.calls[0][0]).toBe(0);
  12. // 判断函数第二次被执行的第一个形参为1
  13. expect(mockCallback.mock.calls[1][0]).toBe(1);

从上面可以看到这种玩法很类似于sinon的 sinon.spy()。

当然也有类似于stub返回值的那种玩法,更多的请参考 jest mock的更多玩法

mock文件和css module的问题

如果js文件中引用了css或者本地其他文件,那么就可能测试失败。

为了解决这个问题,同时也为了提高测试效率,:

  1. "jest": {
  2. "moduleNameMapper": {
  3. "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/test/config/fileMock.js",
  4. "\\.(css|less)$": "identity-obj-proxy"
  5. }

而fileMock.js文件内容为:

  1. module.exports = 'test-file-stub';

然后安装identity-obj-proxy即可:

  1. npm install --save-dev identity-obj-proxy

jest与别名

在webpack中经常会用到别名,而jest测试时,如果文件中引用了别名会出现找不到文件的问题。

毕竟jest测试时没有经过webpack处理

对于以下玩法

  1. resolve: {
  2. alias: {
  3. common: path.resolve(__dirname, 'plugins/common/')
  4. }
  5. }

可以通过

  1. "jest": {
  2. "testRegex": "./src/test/.*.test.js$",
  3. "moduleNameMapper": {
  4. "^common(.*)$": "<rootDir>/plugins/common$1",
  5. }
  6. }

这个和之前 mock文件和css module的问题 一样,都是使用了moduleNameMapper这个属性

生成测试覆盖率报告

只需要在jest命令后加入 --coverage即可

  1. jest --coverage

【前端单元测试入门05】react的单元测试之jest的更多相关文章

  1. 【前端单元测试入门02】react的单元测试之Enzyme

    React项目的单元测试 React的组件结构和JSX语法,对上一章的内容来讲进行测试显得很勉强. React官方已经提供了一个测试工具库:react-dom/test-utils 只是用起来不够方便 ...

  2. 【前端单元测试入门03】Sinon

    前端测试存在的问题 在讲Sinon之前,我们得先讲一下在学习了Mocha.chai以及enzyme之后,我们的前端测试还存在的一些问题. 比如前台测试需要与后台交互,获取后台数据后再根据相应数据进行测 ...

  3. 【前端单元测试入门04】Karma

    Karma 官方介绍 A simple tool that allows you to execute JavaScript code in multiple real browsers. 即一个允许 ...

  4. 【前端单元测试入门01】Mocha与chai

    Mocha 的简介 Mocha是流行的JavaScript测试框架之一,通过它添加和运行测试,从而保证代码质量 Mocha 的安装与配置 全局安装Mocha npm install -g mocha ...

  5. Visual Studio 单元测试之二---顺序单元测试

    原文:Visual Studio 单元测试之二---顺序单元测试 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试 ...

  6. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

  7. 前端迷思与React.js

    前端迷思与React.js 前端技术这几年蓬勃发展, 这是当时某几个项目需要做前端技术选型时, 相关资料整理, 部分评论引用自社区. 开始吧: 目前, Web 开发技术框架选型为两种的占 80% .这 ...

  8. VS2010单元测试入门实践教程

    单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...

  9. 单元测试之NUnit一

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 NUnit是什么? N ...

随机推荐

  1. xpadder教程:自定义设置游戏手柄的图片

    关于xpadder设置按键的教程,网上已经很多,我就不凑这个热闹了.这里介绍的是如何自定义设置手柄的图片,就是按钮的背景图,如下图所示: 步骤: 1)准备一张背景图 注意:格式必须是24位色的BMP位 ...

  2. C++ 监测磁盘空间

    硬盘管理器 头文件 HardDiskManager.h : #if _MSC_VER > 1000 #pragma once #endif #include <windows.h> ...

  3. 借鉴mini2440的usb-wifi工具集在Beagleboard上移植无线网卡

    配置minicom: sudo yum install minicom sudo minicom -s 选择Serial port setup,此时所示光标在"Change which se ...

  4. java读取文件乱码

    List<String> lines=new ArrayList<String>(); BufferedReader br = new BufferedReader(new F ...

  5. IIS部署web,字体404的问题

    今天在部署测试环境的时候,遇到字体无法访问的情况,如下图 其实,字体是存在的.路径也没有错.因为点超链接是可以看到的. 所以,怀疑是服务器不识别该字体.经过网上查找.找到了配置IIS的方法.让服务器可 ...

  6. 【php】DIRECTORY_SEPARATOR的作用

    DIRECTORY_SEPARATOR是php的内部常量,用于显示系统分隔符的命令,不需要任何定义与包含即可直接使用. 在windows下路径分隔符是/(当然/在部分系统上也是可以正常运行的),在li ...

  7. Flex和Servlet结合上传文件报错(一)

    1.具体错误如下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\null ...

  8. (三十二)虚拟机linux系统中安装firefox浏览器

    这几天,第二轮项目迭代进入了尾声,同时也接到了上司领导交代下来的新任务,那就是要我们学习linux系统基础的知识,包括常用命令和web应用的部署问题,于是乎安装了虚拟机和linux操作系统. 我安装的 ...

  9. Linux查看网络的联机状态

    Linux查看网络的联机状态 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ netstat -a^C unix 3 [ ] 流 已连接 14923 @/tmp ...

  10. CentOS6.5 [ERROR] /usr/libexec/mysqld: Can't create/write to file '/var/lib/mysqld/mysqld.pid' (Errcode: 2)

    环境是CentOS6.5,先贴个错误代码: 这个问题解决了大半天,浪费了好多时间,不过也算是值了. 事故起因是因为突然断电,mysql server直接干掉了,也没有备用电源,重启了之后看日志tail ...