React16JestES6ClassMocks(使用ES6語法類的模擬)例項二
轉載地址
React 16 Jest ES6 Class Mocks(使用ES6語法類的模擬) 例項二
專案初始化
git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git
cd webpack4-react16-reactrouter-demo
git fetch origin
git checkout v_1.0.30
npm install
ES6 Class Mocks(使用ES6語法類的模擬)
Jest可用於模擬匯入到要測試的檔案中的ES6語法的類。
ES6語法的類是具有一些語法糖的建構函式。因此,ES6語法的類的任何模擬都必須是函式或實際的ES6語法的類(這也是另一個函式)。
所以可以使用模擬函式來模擬它們。如下
ES6語法的類測試例項二,今天使用第二種方式 – 手動模擬(Manual mock)
ES6語法類的例項
這裡的例項我使用官方的例子,SoundPlayer類和SoundPlayerConsumer消費者類。下面部分檔案的內容參考上篇文章React 16 Jest ES6 Class Mocks(使用ES6語法類的模擬)src/lib/sound-player.js
export default class SoundPlayer {
constructor() {
this.name = `Player1`;
this.fileName = ``;
}
choicePlaySoundFile(fileName) {
this.fileName = fileName;
}
playSoundFile() {
console.log(`播放的檔案是:`, this.fileName);
}
}
src/lib/sound-player-consumer.js
import SoundPlayer from `./sound-player`;
export default class SoundPlayerConsumer {
constructor() {
this.soundPlayer = new SoundPlayer();
}
play() {
const coolSoundFileName = `song.mp3`;
this.soundPlayer.choicePlaySoundFile(coolSoundFileName);
this.soundPlayer.playSoundFile();
}
}
通過在__mocks__資料夾中建立一個模擬實現來建立手動模擬。
這個可以指定實現,並且可以通過測試檔案使用它。如下
src/lib/__mocks__/sound-player.js
export const mockChoicePlaySoundFile = jest.fn();
const mockPlaySoundFile = jest.fn();
const mock = jest.fn().mockImplementation(() => {
const data = {
choicePlaySoundFile: mockChoicePlaySoundFile,
playSoundFile: mockPlaySoundFile,
};
return data;
});
export default mock;
然後在測試用例中匯入mock和mock方法,具體如下
import SoundPlayer, { mockChoicePlaySoundFile } from `../lib/sound-player`;
import SoundPlayerConsumer from `../lib/sound-player-consumer`;
jest.mock(`../lib/sound-player`); // SoundPlayer 現在是一個模擬建構函式
beforeEach(() => {
// 清除所有例項並呼叫建構函式和所有方法:
SoundPlayer.mockClear();
mockChoicePlaySoundFile.mockClear();
});
it(`我們可以檢查SoundPlayerConsumer是否呼叫了類建構函式`, () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
expect(SoundPlayer).toHaveBeenCalledTimes(1);
});
it(`我們可以檢查SoundPlayerConsumer是否在類例項上呼叫了一個方法`, () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
const coolSoundFileName = `song.mp3`;
soundPlayerConsumer.play();
expect(mockChoicePlaySoundFile).toHaveBeenCalledWith(coolSoundFileName);
});
執行後得到的結果如下
PASS src/__tests__/jest_sound_player_2.test.js
我們可以檢查SoundPlayerConsumer是否呼叫了類建構函式 (7ms)
我們可以檢查SoundPlayerConsumer是否在類例項上呼叫了一個方法 (2ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 3.352s
Ran all test suites matching /src/__tests__/jest_sound_player_2.test.js/i.
下次介紹第三、四種方法 – 使用模組工廠引數呼叫jest.mock()(Calling jest.mock() with the module factory parameter)和使用mockImplementation()或mockImplementationOnce()替換mock(Replacing the mock using mockImplementation()
or mockImplementationOnce()
)
實踐專案地址
git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git
git checkout v_1.0.31
相關文章
- React16JestES6ClassMocks(使用ES6語法類的模擬)例項一ReactSSMMock
- ES6的模組化語法
- flex佈局語法+例項Flex
- Python中的if、while、for 語法及例項PythonWhile
- ES6語法(二) 函式函式
- ES6 模組語法——export 命令Export
- ES6 模組語法——import 命令Import
- Python中compile函式的語法及例項!PythonCompile函式
- HTML基本語法和語義寫法規則與例項HTML
- 重學ES6基礎語法(二)
- 管理 Windows 例項的高效方法 —— 使用 WindowExtensions 類Windows
- axios模擬GET請求例項及詳解iOS
- ThinkPHP6 核心分析(二):Request 類的例項化PHP
- 利用 es6 new.target 來對模擬抽象類抽象
- 類和例項
- java中String類常用方法的使用與例項Java
- [譯]使用JavaScript建立WebAssembly模組例項JavaScriptWeb
- es6語法
- php語法同java語法的基本區別(例項專案需求,php才能熟)PHPJava
- 例項演示如何使用CCE XGPU虛擬化GPU
- ES6建立類的基本語法和繼承實現原理繼承
- Dart - 抽象類的例項化Dart抽象
- ES6的相關語法
- 例項 靜態 類
- python 類和例項Python
- vscode使用ES6裝飾器器語法VSCode
- ES6常用語法
- CMakeLists.txt 語法介紹與例項演練
- 如何在vue中使用jsx與ES6類的寫法VueJS
- Java登陸第三十三天——ES6(二)reset、spread、Class類語法糖Java
- python使用ctypes呼叫擴充套件模組的例項方法Python套件
- 用鬥地主的例項學會使用java Collections工具類Java
- JVM初探(五):類的例項化JVM
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- 使用 __get__ 向已有類例項注入函式函式
- makefile--偽目標語法與程式設計例項程式設計
- ES6新語法上
- ES6常用語法(下)