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.29
npm install
ES6 Class Mocks(使用ES6語法類的模擬)
Jest可用於模擬匯入到要測試的檔案中的ES6語法的類。
ES6語法的類是具有一些語法糖的建構函式。因此,ES6語法的類的任何模擬都必須是函式或實際的ES6語法的類(這也是另一個函式)。
所以可以使用模擬函式來模擬它們。如下
一個ES6語法類的例項
這裡的例項我使用官方的例子,SoundPlayer類和SoundPlayerConsumer消費者類。
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();
}
}
這個測試官方介紹了四種方式來建立一個ES6語法的類測試,今天先使用第一種方式 – 自動模擬(Automatic mock)
呼叫jest.mock(`../lib/sound-player`)會返回一個有用的“自動模擬”,可以使用它來監視對類建構函式及其所有方法的呼叫。
它用模擬建構函式替換ES6語法的類,並使用總是返回undefined的mock函式替換它的所有方法。
方法呼叫儲存在AutomaticMock.mock.instances [index] .methodName.mock.calls中。
請注意,如果在類中使用箭頭功能,它們將不會成為模擬的一部分。
原因是箭頭函式不存在於物件的原型上,它們只是包含對函式的引用的屬性。
如果不需要替換類的實現,這是最簡單的設定選項。測試用例如下:
src/__tests__/jest_sound_player.test.js
import SoundPlayer from `../lib/sound-player`;
import SoundPlayerConsumer from `../lib/sound-player-consumer`;
jest.mock(`../lib/sound-player`); // SoundPlayer 現在是一個模擬建構函式
beforeEach(() => {
// 清除所有例項並呼叫建構函式和所有方法:
SoundPlayer.mockClear();
});
it(`我們可以檢查SoundPlayerConsumer是否呼叫了類建構函式`, () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
expect(SoundPlayer).toHaveBeenCalledTimes(1);
});
it(`我們可以檢查SoundPlayerConsumer是否在類例項上呼叫了一個方法`, () => {
// 檢查 mockClear() 會否起作用:
expect(SoundPlayer).not.toHaveBeenCalled();
const soundPlayerConsumer = new SoundPlayerConsumer();
// 類建構函式再次被呼叫
expect(SoundPlayer).toHaveBeenCalledTimes(1);
const coolSoundFileName = `song.mp3`;
soundPlayerConsumer.play();
// mock.instances可用於自動模擬
const mockSoundPlayerInstance = SoundPlayer.mock.instances[0];
const mockChoicePlaySoundFile = mockSoundPlayerInstance.choicePlaySoundFile;
expect(mockChoicePlaySoundFile.mock.calls[0][0]).toEqual(coolSoundFileName);
// 相當於上面的檢查
expect(mockChoicePlaySoundFile).toHaveBeenCalledWith(coolSoundFileName);
expect(mockChoicePlaySoundFile).toHaveBeenCalledTimes(1);
});
執行會得到類似如下輸出
PASS src/__tests__/jest_sound_player.test.js
我們可以檢查SoundPlayerConsumer是否呼叫了類建構函式 (4ms)
我們可以檢查SoundPlayerConsumer是否在類例項上呼叫了一個方法 (3ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 2.27s
Ran all test suites matching /src/__tests__/jest_sound_player.test.js/i.
下次介紹第二種方法 – 手動模擬(Manual mock)
實踐專案地址
git clone https://github.com/durban89/webpack4-react16-reactrouter-demo.git
git checkout v_1.0.30
相關文章
- React16JestES6ClassMocks(使用ES6語法類的模擬)例項二ReactSSMMock
- ES6的模組化語法
- flex佈局語法+例項Flex
- Python中的if、while、for 語法及例項PythonWhile
- ES6 模組語法——export 命令Export
- ES6 模組語法——import 命令Import
- Python中compile函式的語法及例項!PythonCompile函式
- HTML基本語法和語義寫法規則與例項HTML
- 管理 Windows 例項的高效方法 —— 使用 WindowExtensions 類Windows
- axios模擬GET請求例項及詳解iOS
- 利用 es6 new.target 來對模擬抽象類抽象
- 類和例項
- java中String類常用方法的使用與例項Java
- [譯]使用JavaScript建立WebAssembly模組例項JavaScriptWeb
- es6語法
- php語法同java語法的基本區別(例項專案需求,php才能熟)PHPJava
- 使用ES6的新特性Proxy來實現一個資料繫結例項
- 例項演示如何使用CCE XGPU虛擬化GPU
- ES6建立類的基本語法和繼承實現原理繼承
- Dart - 抽象類的例項化Dart抽象
- ES6的相關語法
- 例項 靜態 類
- python 類和例項Python
- vscode使用ES6裝飾器器語法VSCode
- ES6常用語法
- CMakeLists.txt 語法介紹與例項演練
- 如何在vue中使用jsx與ES6類的寫法VueJS
- python使用ctypes呼叫擴充套件模組的例項方法Python套件
- 用鬥地主的例項學會使用java Collections工具類Java
- GObject學習筆記(一)類和例項GoObject筆記
- JVM初探(五):類的例項化JVM
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- ES6語法(一)塊級作用域、字串字串
- 使用 __get__ 向已有類例項注入函式函式
- makefile--偽目標語法與程式設計例項程式設計
- 關於類的初始化以及類的例項化一些思考
- 分享一個Laravel中的管道的使用例項Laravel
- ES6新語法上