Jest单元测试

Jest是facebook出品的JavaScript单元测试软件.

最常用的代码: expect(变量).toEqual(期待值);

示例代码:

import sum from '../_study/sum';
// const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
    expect(sum(1, 2)).toBe(3);
});

test('判断2+4不等于5', () => {
    expect(sum(2, 4)).not.toBe(5);
});

[参考资料]

中文文档:

http://facebook.github.io/jest/docs/zh-Hans/getting-started.html

官方示例代码:

https://github.com/facebook/jest/tree/master/examples

API 接口列表: http://facebook.github.io/jest/docs/en/jest-object.html#content

数值比较API: https://facebook.github.io/jest/docs/en/expect.html

初尝 Jest 单元测试: http://imweb.io/topic/592aab6eff03ef1a4ef15c51

Jest官方博客: https://facebook.github.io/jest/blog

https://dev.to/preslavrachev/testing-react-native-applications-part-i-jest

https://stackoverflow.com/questions/40449434/mocking-globals-in-jest

ant design的测试(非常简单): https://github.com/ant-design/ant-design-mobile/blob/master/tests/shared/demoTest.js

https://facebook.github.io/jest/docs/jest-object.html

https://github.com/wheresrhys/fetch-mock

https://www.snip2code.com/Snippet/1682585/Mock-Fetch-with-Jest/

http://www.wheresrhys.co.uk/fetch-mock/api

全栈React: 第25天 使用Enzyme做更好的测试 http://zcfy.cc/article/fullstack-react-better-testing-with-enzyme-3806.html

https://facebook.github.io/react/docs/test-utils.html

快照测试如何对比不同状态下的组件?

[安装命令行工具]

npm install -g jest

[运行测试]

[在 WebStorm中运行]

打开__tests__中的文件, 点击行号右侧的运行小箭头即可. 或者右键点击, 选择 Run xx.js

[命令行运行]

运行所有测试 (默认):

cd __tests__
jest

运行指定测试, 通过命名规则或者指定文件名:

jest my-test #or
jest path/to/my-test.js

只针对 hg/git 中已修改的文件运行测试 (未提交的文件):

jest -o

运行文件 path/to/fileA.jspath/to/fileB.js的关联测试:

jest --findRelatedTests path/to/fileA.js path/to/fileB.js

Run tests that match this spec name (match against the name in describe or test, basically).

jest -t name-of-spec

监视模式运行:

jest --watch #runs jest -o by default
jest --watchAll #runs all tests

监视模式下也可以指定文件名或者路径来集中处理指定组的测试.

[使用npm脚本运行]

在package.json中添加配置项:

"scripts": {
...
  "test": "jest",
},
...,
"devDependencies": {
    "babel-jest": "19.0.0",
    "babel-preset-react-native": "1.9.1",
    "jest": "19.0.2",
    "react-test-renderer": "15.4.2"
  },
  "jest": {
    "preset": "react-native",
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
    "verbose": true,
    "collectCoverage": true,
    "moduleFileExtensions": [
      "js"
    ],
    "globals": {
      "__DEV__": true
    },
    "transform": {
      "^.+\\.js$": "babel-jest"
    },
    "transformIgnorePatterns": [
      "node_modules/(?!react-native|react-navigation)/"
    ]
  },

注意下面代码是为了解决ES6语法的库运行时的报错问题.

"transform": { "^.+\\.js$": "babel-jest"}

然后可以运行:

npm test

完整的命令行选项请参考: https://facebook.github.io/jest/docs/cli.html

[延迟判断测试]

有时候某些测试必须等待几个毫秒来执行, 这时候就需要用到延迟判断. 典型的场景如下: App中发起了一次网络请求, 然后根据返回的数据更新了一些状态. 虽然网络请求使用mock会很快, 但是整个执行过程并不是同步的, 究竟多久执行完也是无法确定的, 因此需要稍微延迟一下进行状态判断测试.

// 延迟等待判断的测试, 参考: https://github.com/facebook/jest/issues/42
// 注意done参数一定不要漏掉了

test("takes a long time", function(done) {
    // do something
    setTimeout(function() {
        // run your expectation
        expect(0).not.toBe(10);
        done();
    }, 1000);
});

// 简化等效写法
test('real timer ', (done) => {
    setTimeout(function() {
        // run your expectation
        expect(0).not.toBe(10);
        done();
    }, 1000);
});

[常见错误及解决]

[import语法不对]

https://stackoverflow.com/questions/43514455/react-nativejestsyntaxerror-unexpected-token-import

[Test suite failed to run Invariant Violation: Native module cannot be null.]

​ at invariant (node_modules/fbjs/lib/invariant.js:44:7)

​ at new NativeEventEmitter (node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js:32:1)

​ at Object.<anonymous style="-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-size-adjust: none; box-sizing: border-box;"> (node_modules/react-native/Libraries/Network/NetInfo.js:20:25)</anonymous>

​ at Object.get NetInfo [as NetInfo] (node_modules/react-native/Libraries/react-native/react-native.js:93:22)

​ at new NetInfoSingleton (app/util/NetInfoSingleton.js:24:13)

​ at Object.<anonymous style="-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-size-adjust: none; box-sizing: border-box;"> (app/util/NetInfoSingleton.js:48:25)</anonymous>

参考: https://github.com/facebook/jest/issues/2208

需要mock native的一些行为. 这个导致RN测试比较难做.

[refs测试子组件找不到如何解决?]

Refs are null in Jest snapshot tests with react-test-renderer

https://github.com/facebook/jest/issues/42

解决: 测试之前需要mock一些假的refs代码

let instance = wrapper.instance();  
instance.refs = {timerButton: { state: {counting: false}}};
    instance._requestSMSCode();

    // 使用真正的定时器, 否则异步执行会立即返回, 导致状态判断出错
    jest.useRealTimers();

    setTimeout(function() {
        // run your expectation
        expect(instance.state.verifyText).toEqual('需要图形码44');
        console.log("instance.state", instance.state);
        console.log("instance.refs", instance.refs);
        done();
    }, 1000);

[代码中import了json资源但是提示访问不到?]

https://github.com/facebook/jest/issues/238

import xxx from '../data/myjson';// myjson.json

出错信息: Cannot find module '../data/myjson' from 'xxxTest.js'

解决: 修改package.json中的jest配置, 加入json扩展名

"moduleFileExtensions": [
       "js", "jsx", "json" 
 ]

[mock代码被当做测试执行报错?]

https://github.com/facebook/jest/tree/master/examples/manual-mocks

参考这里的目录结构, __tests____mocks__分开存放test.js文件和mock的类.

[WebStorm集成Jest](

[运行单个测试]

打开测试代码, 点击代码测试方法最左侧的向右三角箭头即可运行单个测试.

[运行所有测试]

Run > Edit Configurations, 然后点击 + 号按钮, 类别那里选择 Jest, 默认就会生成一个运行所有Test的Jest任务. 点击工具栏上的 运行 按钮即可.

[WebStorm增加Jest函数补全提示]

[WebStorm – Preferences – Languages & Frameworks – JavaScript – Libraries, 点击 Download 然后找到列表页中的 Jest, 然后点击 Download and Install.]

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • React Native优秀博客,以及优秀的Github库列表(很多英文资料源自于[awesome-react-n...
    董董董董董董董董董大笨蛋阅读 10,586评论 4 162
  • 十八大以来我们进入了新时代,在新时代我们所有人共同目标是实现中华民族伟大复兴的中国梦。这个梦从1840年鸦片...
    青之心路阅读 273评论 0 1
  • 星期天来到了这一天正好是奶奶的生日。奶奶喜欢吃鲫鱼,爸爸买回来了两条鲫鱼, 妈妈一看,问:“ 你怎么买了两条...
    极光落日阅读 218评论 2 1
  • 风 虚掩在岸上 水 被刺的支离破碎 时而痛的直在瀑布里打滚 荡出不规则的涟漪 藻荇 摒弃了鲫鲤 偷偷赶来凑热闹 浪...
    木云yang阅读 501评论 2 2