Jest 筆記
外部Library的mock方法
import { function1, function2 } from 'library';
jest.mock('library', () => {
return {
function1: jest.fn(),
function2: jest.fn(),
};
});
官網有列出下列方法: (關於mock會提升到最前面官網的解釋在這裡)
jest.mock('node-fetch'); // 這裡是因為jest會把mock提升到最前面執行
import fetch, {Response} from 'node-fetch';
import {createUser} from './createUser';
// jest.mock('node-fetch'); <-原本應該是在這邊
test('createUser calls fetch with the right args and returns the user id', async () => {
fetch.mockReturnValue(Promise.resolve(new Response('4'))); // fetch是class
const userId = await createUser();
expect(fetch).toHaveBeenCalledTimes(1);
expect(fetch).toHaveBeenCalledWith('https://website.com/users', {
method: 'POST',
});
expect(userId).toBe('4');
});
但我實測必須是class才能直接mock後執行.mockReturnValue()或.mockImplementation(),不然會出現library._default.mockImplementation is not a function
error。所以推測fetch應該是以class export出來的class。
只Mock package內特定某個函數
可以使用jest.requireActual,讓該package其他函數依照原本的方式運作。
開始測試之後可以使用jest.mockImplementationOnce()
或是jest.mockImplementation()
去更改mock的方法
import { useMatch } from 'react-router-dom';
// 下面這個jest.mock()執行時,會被提升到最前面
jest.mock('react-router-dom', () => {
return {
...jest.requireActual('react-router-dom'),
useMatch: jest.fn(() => null),
};
});
describe('<Component />', () => {
it('should be status 1', () => {
render(<Component />);
// 此時component內的useMatch()會回傳null (依照上面定義)
});
it('should be status 2', () => {
useMatch.mockImplementationOnce(() => true);
render(<Component />);
// 此時component內的useMatch()會回傳true
});
});
這樣就可以測試Component在route match時的狀態了。
reset processes
清除所有mock被call的次數
beforeEach(() => {
jest.clearAllMocks();
});
// or clear single mock funtion
mockFunction.mockClear()
Sample
redux slice (with default export reducer & export actions)
jest.mock('../slice', () => {
const reducers = jest.requireActual('../slice');
return {
__esModule: true,
...reducers,
actionOne: jest.fn(),
};
});
Intellisense Setting
有幾個方法能讓VSCode在以下檔案類別*.spec.js(x)?
, *.test.js(x)?
能提供jest intellisense
- 安裝
@testing-library/jest-dom
yarn add -D @testing-library/jest-dom
- 安裝
@types/jest
yarn add -D @types/jest