Jest 使用指南 - - Mock 篇
#jest
Jest Mock
为什么会用到 Mock? Mock 能帮我们解决什么问题?
在项目中,一个模块的方法内常常会去调用另外一个模块的方法。在单元测试中,我们可能并不需要关心内部调用的方法的执行过程和结果,只想知道它是否被正确调用即可,甚至会指定该函数的返回值。此时,使用Mock函数是十分有必要。
Mock函数提供的以下三种特性,在我们写测试代码时十分有用:
- 擦除函数的实际实现(换句话说:改变函数的内部实现)
- 捕获函数调用情况( 包括:这些调用中传递的参数、new 的实例)
- 设置函数返回值
jest.fn()
Jest.fn()是创建Mock函数最简单的方式,如果没有定义函数内部的实现,jest.fn()会返回undefined作为返回值。
Jest.fn()所创建的Mock函数还可以设置返回值,定义内部实现或返回Promise对象。
test("测试jest.fn()返回固定值", () => {
let mockFn = jest.fn().mockReturnValue("Felix");
// 断言 mockFn 执行后返回值为Felix
expect(mockFn()).toBe("Felix");
myMock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true);
// > 10 'x' true
});
test("测试jest.fn()内部实现", () => {
let mockFn = jest.fn((x) => 42 + x);
// 断言mockFn执行后返回 52
expect(mockFn(10)).toBe(52);
});
test("测试jest.fn()返回Promise", async () => {
let mockFn = jest.fn().mockResolvedValue("Felix");
let result = await mockFn