在編寫單元測試過程中經(jīng)常遇到需要依賴外部數(shù)據(jù)的情況牛欢,比如異步請求就需要依賴網(wǎng)絡(luò),但我們在測試過程中又不允許發(fā)起實際請求,這種情況下就需要mock函數(shù)替代真實請求結(jié)果。
測試中用到mock函數(shù)的三種情況
1. 函數(shù)的調(diào)用捕獲
用于測試回調(diào)函數(shù)時可以捕獲函數(shù)有沒被調(diào)用糟秘,參數(shù)是什么,返回值是什么等球散。
// 被測試代碼
const processProducts = (products, callback) => {
products.forEach(product => {
callback(product)
})
}
// 測試代碼
const mockFunc = jest.fn()
processProducts([{...}], mockFunc)
expect(mockFunc.mock.calls.length).toBe(2)
// mockFunc有calls尿赚,results等屬性
2. 設(shè)置函數(shù)返回值
可以通過mock函數(shù)的mockReturnValue()方法定制返回值,它的參數(shù)就是返回值。
- mockReturnValue():返回直量凌净;
- mockResolvedValue():返回promise悲龟;
// 同1中的processProducts案例,如果此函數(shù)有返回值
processProducts = jest.fn()
processProducts.mockReturnValue({name: "dennis"})
// 當(dāng)測試代碼調(diào)用processProducts的時候就會返回{name: "dennis"}
3. 改變原函數(shù)的實現(xiàn)
jest.fn()是默認(rèn)的mock函數(shù)泻蚊,如果不想使用默認(rèn)或者提供函數(shù)實現(xiàn)則可以加上參數(shù)躲舌。
const mockFunc = jest.fn(x => x + 1)
4. mock模塊
以上三種實現(xiàn)都是通過jest.fn()mock函數(shù)丑婿,而jest.mock()則可以mock模塊性雄。
- jest.mock()
- jest.spyOn()
// 第一種
jest.mock('request');
const request = require('request');
// mock math 對象上的add方法
const addMock = jest.spyOn(math, "add");
addMock.mockImplementation(() => "mock"); // 提供一個實現(xiàn)
// 第二種
jest.mock('request', () => {
return (url, callback) => {
callback(null, 'ok', {name: 'sam'})
}
});
const fetchData = require('./func').fetchData;
test('should return data when fetchData request success', () => {
return fetchData().then(res => {
expect(res).toEqual({name: 'sam'})
})
})
5. 鉤子函數(shù)
- beforeAll
- beforeEach
describe('method called', () => {
beforeEach(() => {
window.unicode = false;
window.local = false;
window.isEnable = false
})
})