99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Jest 測(cè)試 React Native 應(yīng)用程序

2021-09-18 20:41 更新

在 Facebook,我們使用 Jest 來(lái)測(cè)試React Native應(yīng)用程序。

安裝

從 react-native 0.38 版開(kāi)始,運(yùn)行?react-native init?. 以下配置應(yīng)自動(dòng)添加到 package.json 文件中:

  1. // package.json
  2. "scripts": {
  3. "test": "jest"
  4. },
  5. "jest": {
  6. "preset": "react-native"
  7. }

注意:如果你正在升級(jí) react-native 應(yīng)用程序并且之前使用了?jest-react-native?預(yù)設(shè),請(qǐng)從?package.json?文件中刪除依賴(lài)項(xiàng)并將預(yù)設(shè)更改為?react-native?。

用 yarn test 來(lái)運(yùn)行 Jest 測(cè)試。

快照測(cè)試

下面來(lái)為一個(gè)入門(mén)的小型組件創(chuàng)建一個(gè)快照測(cè)試,它的內(nèi)部有些View、Text組件和一些樣式:

  1. // Intro.js
  2. import React, {Component} from 'react';
  3. import {StyleSheet, Text, View} from 'react-native';
  4. const styles = StyleSheet.create({
  5. container: {
  6. alignItems: 'center',
  7. backgroundColor: '#F5FCFF',
  8. flex: 1,
  9. justifyContent: 'center',
  10. },
  11. instructions: {
  12. color: '#333333',
  13. marginBottom: 5,
  14. textAlign: 'center',
  15. },
  16. welcome: {
  17. fontSize: 20,
  18. margin: 10,
  19. textAlign: 'center',
  20. },
  21. });
  22. export default class Intro extends Component {
  23. render() {
  24. return (
  25. <View style={styles.container}>
  26. <Text style={styles.welcome}>Welcome to React Native!</Text>
  27. <Text style={styles.instructions}>
  28. 這是一個(gè) React Native 快照測(cè)試。
  29. </Text>
  30. </View>
  31. );
  32. }
  33. }

現(xiàn)在,使用React的test renderer和Jest的快照特性來(lái)和組件交互,獲得渲染結(jié)果和生成快照文件:

  1. // __tests__/Intro-test.js
  2. import React from 'react';
  3. import renderer from 'react-test-renderer';
  4. import Intro from '../Intro';
  5. test('renders correctly', () => {
  6. const tree = renderer.create(<Intro />).toJSON();
  7. expect(tree).toMatchSnapshot();
  8. });

當(dāng)你運(yùn)行 ?npm test? 或者 ?jest?,將產(chǎn)生一個(gè)像下面的文件:

  1. // __tests__/__snapshots__/Intro-test.js.snap
  2. exports[`Intro renders correctly 1`] = `
  3. <View
  4. style={
  5. Object {
  6. "alignItems": "center",
  7. "backgroundColor": "#F5FCFF",
  8. "flex": 1,
  9. "justifyContent": "center",
  10. }
  11. }>
  12. <Text
  13. style={
  14. Object {
  15. "fontSize": 20,
  16. "margin": 10,
  17. "textAlign": "center",
  18. }
  19. }>
  20. Welcome to React Native!
  21. </Text>
  22. <Text
  23. style={
  24. Object {
  25. "color": "#333333",
  26. "marginBottom": 5,
  27. "textAlign": "center",
  28. }
  29. }>
  30. This is a React Native snapshot test.
  31. </Text>
  32. </View>
  33. `;

下次你運(yùn)行測(cè)試時(shí),渲染的結(jié)果將會(huì)和之前創(chuàng)建的快照進(jìn)行比較??煺諔?yīng)與代碼更改一起提交。當(dāng)快照測(cè)試失敗,你需要去檢查是否是你想要或不想要的變動(dòng)。 如果變動(dòng)符合預(yù)期,你可以通過(guò)?jest -u?調(diào)用Jest從而重寫(xiě)存在的快照。

示例代碼可在 examples/enzyme 找到。

預(yù)設(shè)配置

預(yù)設(shè)設(shè)置了環(huán)境,并且非常的牢固,并且基于我們?cè)?Facebook 發(fā)現(xiàn)的有用內(nèi)容。所有配置選項(xiàng)都可以被覆蓋,就像在不使用預(yù)設(shè)時(shí)可以自定義一樣。

環(huán)境

?react-native?附帶一個(gè) Jest 預(yù)設(shè),因此?jest.preset?您的字段?package.json?應(yīng)該指向?react-native?. 預(yù)設(shè)是一個(gè)模仿 React Native 應(yīng)用程序環(huán)境的節(jié)點(diǎn)環(huán)境。因?yàn)樗患虞d任何 DOM 或?yàn)g覽器 API,所以大大縮短了 Jest 的啟動(dòng)時(shí)間。

transformIgnorePatterns 自定義

transformIgnorePatterns選項(xiàng)可用于指定 Babel 應(yīng)轉(zhuǎn)換哪些文件。不幸的是,許多 react-native npm 模塊在發(fā)布之前沒(méi)有預(yù)編譯它們的源代碼。

默認(rèn)情況下, jest-react-native 預(yù)設(shè)只處理項(xiàng)目自己的源文件和 react-native。如果有必須轉(zhuǎn)換的 npm 依賴(lài)項(xiàng),可以通過(guò)包含 react-native 以外的模塊來(lái)自定義此配置選項(xiàng):

  1. "transformIgnorePatterns": [
  2. "node_modules/(?!(react-native|my-project|react-native-button)/)"
  3. ]

設(shè)置文件

如果想為每個(gè)測(cè)試文件提供額外的配置,可以使用?setupFiles?配置選項(xiàng)來(lái)指定安裝腳本。

模塊名稱(chēng)映射器

moduleNameMapper可用于一個(gè)模塊路徑映射到不同的模塊。默認(rèn)情況下,預(yù)設(shè)將所有圖像映射到圖像存根模塊,但如果找不到模塊,此配置選項(xiàng)可以提供幫助:

  1. "moduleNameMapper": {
  2. "my-module.js": "<rootDir>/path/to/my-module.js"
  3. }

提示

使用 jest.mock 模擬本機(jī)模塊

內(nèi)置的 Jest 預(yù)設(shè)?react-native?附帶了一些應(yīng)用于 react-native 存儲(chǔ)庫(kù)的默認(rèn)模擬。但是,一些 react-native 組件或第三方組件依賴(lài)于本地代碼來(lái)呈現(xiàn)。在這種情況下,Jest 的手動(dòng)模擬系統(tǒng)可以幫助模擬底層實(shí)現(xiàn)。

例如,如果你的代碼依賴(lài)于一個(gè)名為?react-native-video?的第三方本機(jī)視頻組件,你可能希望使用這樣的手動(dòng)模擬將其存根:

  1. jest.mock('react-native-video', () => 'Video');

這將使組件呈現(xiàn)為?<Video{…props}/>?,其所有道具都將顯示在快照輸出中。想了解更多還可以閱讀 caveats around Enzyme and React 16.

有時(shí)需要提供更復(fù)雜的手動(dòng)模擬。例如,如果想將原生組件的 prop 類(lèi)型或靜態(tài)字段轉(zhuǎn)發(fā)到模擬,可以通過(guò) jest-react-native 的這個(gè)助手從模擬中返回不同的 React 組件:

  1. jest.mock('path/to/MyNativeComponent', () => {
  2. const mockComponent = require('react-native/jest/mockComponent');
  3. return mockComponent('path/to/MyNativeComponent');
  4. });

或者,如果想創(chuàng)建自己的手動(dòng)模擬,可以執(zhí)行以下操作:

  1. jest.mock('Text', () => {
  2. const RealComponent = jest.requireActual('Text');
  3. const React = require('React');
  4. class Text extends React.Component {
  5. render() {
  6. return React.createElement('Text', this.props, this.props.children);
  7. }
  8. }
  9. Text.propTypes = RealComponent.propTypes;
  10. return Text;
  11. });

在其他情況下,想要模擬不是 React 組件的本機(jī)模塊??梢詰?yīng)用相同的技術(shù)。我們建議在真實(shí)設(shè)備上運(yùn)行 React Native 應(yīng)用程序時(shí)檢查原生模塊的源代碼并記錄模塊,然后在真實(shí)模塊之后對(duì)手動(dòng)模擬進(jìn)行建模。

如果你最終一遍又一遍地模擬相同的模塊,建議在單獨(dú)的文件中定義這些模擬并將其添加到?setupFiles?.


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)