Jest

1. 介绍

Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言、JSDom、覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架。

2. 安装
  • 通过 npm 添加依赖:
 npm install --save-dev jest babel-jest babel-core babel-preset-env  
 regenerator-runtime

babel-jest、 babel-core、 regenerator-runtime、babel-preset-env这几个依赖是为了让我们可以使用ES6的语法特性进行单元测试,ES6提供的 import 来导入模块的方式,Jest本身是不支持的。

  • 添加.babelrc文件
    在项目的根目录下添加.babelrc文件,并在文件复制如下内容:
  {
    "presets": ["env"]
  }
  • 修改package.json中的test脚本
    打开package.json文件,将script下的test的值修改为jest:
    "scripts": {
      "test": "jest"
    }
3. 使用
  • sum.js
   import axios from 'axios';

   function sum (a, b) {
       return a+b;
   }
   function add (a, b) {
     return a+b;
   }
   function fetchUser() {
     return axios.get('http://jsonplaceholder.typicode.com/users/1')
       .then(res => res.data)
       .catch(error => console.log(error));
   }
   export {
     sum,
     fetchUser
   }
  • sun.test.js
  import {sum , fetchUser}  from './sum';
  // const fetchUser = require('./sum')

  // 1. 相等判断:toBe 使用 Object.is 来判断相等,
  // toEqual 会递归判断 Object 的每一个字段,
  // 对数值来说 toBe 和 toEqual 相同;
  test("两个数字相加", () => {
    expect(sum(1,2)).not.toBe(2);
  })

test('object assignment', () => {
  const data = {one: 1};
  data['two'] = 2;
  expect(data).toEqual({one: 1, two: 2});
});

// 2. 判断符点数:可使用 toBeCloseTo 来解决 JS 浮点精度带来的问题,如下示例;
test('adding floating point numbers', () => {
  const value = 0.1 + 0.2; // 0.30000000000000004
  expect(value).toBeCloseTo(0.3); // 测试通过
});

test('fetchUser() 可以请求到一个含有name属性值为Leanne Graham的对象', () => {
  expect.assertions(1);
  return fetchUser()
    .then(data => {
      expect(data.name).toBe('Leanne Graham');
    });
});
//上面调用了expect.assertions(1),它能确保在异步的测试用例中,
//有一个断言会在回调函数中被执行。这在进行异步代码的测试中十分有效。

test('mock', () => {
  const mockCallback = jest.fn(x => 42 + x);
  [0, 1].forEach(mockCallback);
  console.log(mockCallback.mock.calls,'mockCallback.mock.calls')
  // Mock函数被调用两次
  expect(mockCallback.mock.calls.length).toBe(2);
  // 第一次调用Mock函数时,第一个参数为0
  expect(mockCallback.mock.calls[0][0]).toBe(0);
  // 第二次调用Mock函数时,第一个参数为1
  expect(mockCallback.mock.calls[1][0]).toBe(1);
  // 第一次调用Mock函数的返回值为42
  expect(mockCallback.mock.results[0].value).toBe(42);

  // const myMock = jest.fn();
  // const a = new myMock();
  // const b = {};
  // const bound = myMock.bind(b);
  // bound();
  // console.log(myMock.mock.instances);
  // // > [ <a>, <b> ]

  // Mock 函数还可以通过工具函数模拟返回值。
  const myMock = jest.fn();
  console.log(myMock());
  // > undefined
  myMock
  .mockReturnValueOnce(10)
  .mockReturnValueOnce('x')
  .mockReturnValue(true);
  console.log(myMock(), myMock(), myMock(), myMock());
  // > 10, 'x', true, true
  });
4. 常用断点
  expect({a:1}).toBe({a:1})//判断两个对象是否相等
  expect(1).not.toBe(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'); //不解释

function compileAndroidCode() {
  throw new ConfigError('you are using the wrong JDK');
}

test('compiling android goes as expected', () => {
  expect(compileAndroidCode).toThrow();
  expect(compileAndroidCode).toThrow(ConfigError); //判断抛出异常
})

了解更多断点

5. 运行测试
  • 运行测试
    npm test
  • 使用 --watch 参数可以启动一个监控界面,当文件发生变化时,会便会运行相关的测试。
    npm test -- --watch
  • 使用 --coverage 参数,测试结束时还会得到一份测试覆盖度报告,如下图。
    npm test -- --coverage
    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269