jest單元測(cè)試(一)

本文是以react-native的項(xiàng)目為前提,記錄使用jest進(jìn)行單元測(cè)試所遇到的一些問題。

準(zhǔn)備工作

  1. 安裝jest,babel-jest,babel-preset-react-native, 注意版本
npm install jest babel-jest babel-preset-react-native --save-dev
  1. 在package.json中配置jest選項(xiàng), 一般rn項(xiàng)目都是采用babel-preset-react-native來transform,這里的preset也設(shè)置為react-native。如果用其他transform規(guī)則,可自行設(shè)置。
"jest": {
    "preset": "react-native",
    "transformIgnorePatterns": [
      "node_modules/(?!(react-native|my-project|react-native-button)/)"
    ]
 },
  1. 在package.json中配置 jest運(yùn)行命令, 之后在項(xiàng)目根目錄下運(yùn)行npm test就能開始測(cè)試,發(fā)現(xiàn)會(huì)提示找不到test的用例
"scripts": {
    "test": "jest --no-cache",
  },
No tests found
  1. 在項(xiàng)目目錄下新建_tests_目錄, 然后就可以開始寫用例了。新建個(gè)app.js文件,代碼如下:
import View from 'react-native';
import React from 'react';
import App from '../App'; 

// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';

it('renders correctly', () => {
  const tree = renderer.create(
    <App />
  );
});

會(huì)得到如下:

 PASS  __tests__/App.js (6.086s)
  ? renders correctly (3972ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        7.831s

注意事項(xiàng)

  • 如果使用babel7,按如下方式添加babel-jest依賴
npm install babel-jest babel-core@^7.0.0-0 @babel/core --save-dev
  • 如果代碼中有使用@修飾符,需要在.babelrc中開啟,默認(rèn)關(guān)閉。必須先安裝這個(gè)插件。
"plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }]
]
  • 運(yùn)行 npm jest ,默認(rèn)是測(cè)試_tests_文件夾里的,實(shí)際還包括各文件夾下面的test.js文件

  • 在package.json文件中對(duì)jest進(jìn)行黑名單白名單設(shè)置

"jest": {
    "transformIgnorePatterns": [
      //這里的設(shè)置意味要轉(zhuǎn)譯node_modules目錄下的react-native,my-project,react-native-button等包,其余不轉(zhuǎn)譯,這里不設(shè)置一般會(huì)轉(zhuǎn)譯報(bào)錯(cuò)
      "node_modules/(?!(react-native|my-project|react-native-button)/)"
    ]
  },
  • 因?yàn)閖est 依賴babel編譯,所以如果項(xiàng)目中混合多個(gè)babel版本一般會(huì)崩,截止到當(dāng)前時(shí)間,react-native~0.55.4還是用的babel6,建議跟著官方走。同時(shí)要注意babel-plugin依賴的版本是否一致,栗子來了:
    為了支持修飾符@,babel6用的是babel-plugin-transform-decorators-legacy模塊而babel7用的是@babel/plugin-proposal-decorators模塊,babelrc依賴代碼如下
"plugins": [
   "transform-decorators-legacy",
 ]
"plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }],
 ]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容