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的常用語法和優越性
- ORACLE 觸發器語法及例項 二Oracle觸發器
- 模擬阻塞會話例項會話
- js模擬實現StringBuffer類功能程式碼例項JS
- ES6語法(二) 函式函式
- (譯)解密 ES6 語法下 React Class類的記憶體使用解密React記憶體
- flex佈局語法+例項Flex
- 觸發器的語法和例項觸發器
- canvas模擬彈幕效果程式碼例項Canvas
- 模擬發放紅包效果程式碼例項
- 利用 es6 new.target 來對模擬抽象類抽象
- javascript模擬jQuery的map()方法程式碼例項mapJavaScriptjQuery
- 使用Python中的字典模擬類Python
- 重學ES6基礎語法(二)
- Python中的if、while、for 語法及例項PythonWhile
- DHTML Tree 使用例項 (二)HTML
- javascript模擬實現ArrayList效果程式碼例項JavaScript
- 模擬實現Object.is()方法程式碼例項Object
- js模擬點選連結程式碼例項JS
- javascript模擬實現toAarray()方法程式碼例項JavaScript
- 模擬select下拉選單程式碼例項
- Windows平臺模擬單例項ASM環境Windows單例ASM
- 一個有趣的CSS例項——模擬Google公司LogoCSSGo
- HTML基本語法和語義寫法規則與例項HTML
- es6語法
- javascript模擬實現連結的title效果例項程式碼JavaScript
- jQuery模擬實現超連結的title程式碼例項jQuery
- axios模擬GET請求例項及詳解iOS
- js模擬實現hashCode()方法程式碼例項JS
- js模擬實現多型效果程式碼例項JS多型
- js模擬實現replaceAll()函式程式碼例項JS函式
- css模擬實現雙擊效果程式碼例項CSS
- css模擬實現雙擊事件程式碼例項CSS事件
- 模擬美化select下拉選單程式碼例項
- 模擬實現連結title效果程式碼例項
- ThinkPHP6 核心分析(二):Request 類的例項化PHP
- Python中類的建立與使用例項Python