Jest 是一个流行的 JavaScript 测试框架,它有许多方便易用的功能,其中包括 Mock 函数。Mock 函数可以模拟真实的函数行为,并且可以在测试中使用它们。在这篇文章中,我们将讨论 Jest 中的 Mock 函数及其用法,包括创建 Mock 函数、Mock 函数的参数与返回值等。
创建 Mock 函数
在 Jest 中创建一个 Mock 函数很容易,只需使用 jest.fn()
方法即可。例如,下面是一个简单的例子,我们创建一个 Mock 函数并调用它:
const myMockFn = jest.fn(); myMockFn(); console.log(myMockFn());
这段代码将输出两次 undefined
,因为我们没有给 Mock 函数任何的参数和返回值。现在,我们来看看如何让 Mock 函数返回我们想要的值。
设置 Mock 函数的返回值
Jest 中的 Mock 函数可以使用 mockReturnValue()
方法来设置返回值,例如:
const myMockFn = jest.fn(); myMockFn.mockReturnValue(42); console.log(myMockFn());
这段代码将输出 42
,因为我们已经在 Mock 函数中设置了返回值为 42
。我们还可以使用 mockResolvedValue()
方法来设置异步函数的返回值,例如:
const myMockFn = jest.fn(); myMockFn.mockResolvedValue(42); myMockFn().then(result => console.log(result));
这段代码将输出 42
,因为我们已经在 Mock 函数中设置了异步函数的返回值为 42
。当然,我们还可以使用 mockRejectedValue()
方法来模拟异步函数的拒绝。
Mock 函数的参数
Jest 中的 Mock 函数可以使用 mock.calls
属性来访问所有的调用参数数组,例如:
const myMockFn = jest.fn(); myMockFn(1, 2, 3); console.log(myMockFn.mock.calls);
这段代码将输出 [[1, 2, 3]]
,因为我们已经在 Mock 函数中传入了参数 1
、2
和 3
,并使用 mock.calls
属性来访问它们。我们还可以使用 mockImplementation()
方法来使用自定义的函数逻辑执行 Mock 函数,例如:
const myMockFn = jest.fn().mockImplementation((x, y) => { return x + y; }); console.log(myMockFn(1, 2));
这段代码将输出 3
,因为我们已经在 Mock 函数中自定义了函数行为,将 x
和 y
相加并返回它们的和。当然,我们还可以使用 mockImplementationOnce()
方法来模拟函数多次调用时返回不同的值。
Mock 模块
除了 Mock 函数之外,Jest 还支持 Mock 模块的功能。Mock 模块可以用来模拟真实模块的行为,并在测试中使用它们。
例如,我们有一个真实的 sum.js
模块,它包含了一个简单的 sum()
函数,用于将两个数字相加:
function sum(a, b) { return a + b; } module.exports = sum;
我们可以使用 Jest 中的 jest.mock()
方法来替换它,例如:
jest.mock('./sum'); const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });
这段代码将使用 Mock 模块来替换 sum.js
,并将其返回值设置为 3
。我们可以使用 expect()
断言来验证它是否运行正确。当然,我们还可以在测试中使用 jest.spyOn()
方法来跟踪函数调用和其参数。
结论
在 Jest 中使用 Mock 函数是一种方便易用的方式来模拟函数行为,并在测试中使用它们。Mock 函数不仅可以设置返回值和参数,还可以使用自定义的函数逻辑执行。Jest 还支持 Mock 模块,它可以用于模拟真实模块的行为,并在测试中使用它们。Mock 函数和 Mock 模块的结合使用,可以大大提高测试效率和代码质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672eb029eedcc8a97c8a78bf