轉載地址react
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
Jest可用於模擬導入到要測試的文件中的ES6語法的類。webpack
ES6語法的類是具備一些語法糖的構造函數。所以,ES6語法的類的任何模擬都必須是函數或實際的ES6語法的類(這也是另外一個函數)。
因此可使用模擬函數來模擬它們。以下git
這裏的實例我使用官方的例子,SoundPlayer類和SoundPlayerConsumer消費者類。github
src/lib/sound-player.jsweb
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.jsnpm
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.jsfetch
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); });
運行會獲得相似以下輸出ui
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