Mock 函数可以使用来测试代码之间的连接,即用来测试函数被调用的参数,返回值,调用了几次等等
测试函数被调用的参数和返回值
创建一个Mock Functions
//定义一个调用一定此时回调函数的方法
function useCallBack(callback, count){
for (let i = 0; i < count; i++){
callback(i)
}
}
定义一个Mock Functions
let callback = jest.fn(x => x*x)
useCallBack(callback, 3)
//期望callback 被调用3次,每次调用的结果分别为0,1,4
expect(callback.mock.calls[0][0]).toBe(0);
expect(callback.mock.calls[1][0]).toBe(1);
expect(callback.mock.calls[2][0]).toBe(2);
expect(callback.mock.results[0].value).toBe(0);
expect(callback.mock.results[1].value).toBe(1);
expect(callback.mock.results[2].value).toBe(4);
测试值注入到Mock Functions
除次之外还可以将测试值注入到Mock Functions中,以模拟替代某些测试环境中难以调用的方法
//定义一个调用一定此时回调函数的方法
let callback = jest.fn();
//在此次测试中为callback注入2个测试值,第一次调用返回"aaa",第二次调用返回"bbb"
callback.mockReturnValueOnce("aaa").mockReturnValueOnce("bbb")
expect(callback()).toBe("aaa");
expect(callback()).toBe("bbb");
模拟实现
模拟函数的实现和测试值注入到Mock Functions比较相似
test("mock function",()=>{
//mockFn是一个模拟的实现,第一次调用执行() => '1',第二次执行调用() => '2',
//当实现调用完了后再次调用则执行() =>'0',mockName会为模拟实现提供一个名称
const mockFn = jest.fn(() => '0')
.mockImplementationOnce(() => '1')
.mockImplementationOnce(() => '2').mockName("mockFn");;
//第一次执行返回“1”,第二次“2”,之后都是“0”,模拟实现的名称为“mockFn”,
//如果没有mockName("mockFn"),将返回jest.fn
expect(mockFn()).toBe("1");
expect(mockFn()).toBe("2");
expect(mockFn()).toBe("0");
expect(mockFn.getMockName()).toBe("mockFn");
})
模拟模块
测试中如果实际调用 API 会使测试缓慢与脆弱,我们可以用 jest.mock(…) 函数模拟 需要的模块,例如axios。
import axios from 'axios';
//模拟模块需要放到test外,不然不会生效
jest.mock('axios');
test("mock axios",()=>{
//模拟axios模块
//当使用axios调用get请求时返回"this is a mock"
axios.get.mockResolvedValue("this is a mock");
//假设这就是我们需要测试额函数
function getMock(){
return axios.get("mock");
}
getMock().then(response => expect(response).toBe("this is a mock"))
})