jest 中的 jest.fn() 和 jest.spyOn() 方法有什么区别

reactjs

1个回答

写回答

顿节活动

2025-07-09 22:47

+ 关注

Java
Java

在 Jest 中,我们经常需要模拟函数的行为或者对函数的调用进行监视。为了实现这些功能,Jest 提供了两个方法:jest.fn()jest.spyOn()。尽管它们的作用类似,但它们之间有一些关键的区别。

jest.fn()

jest.fn()是一个用于模拟函数的 Jest 方法。它可以创建一个函数的模拟实现,以便我们可以在测试中对其进行控制。使用jest.fn()创建的模拟函数可以跟踪其调用次数、传入的参数和返回值。

下面是一个使用jest.fn()的示例代码:

Javascript

// 模拟一个简单的加法函数

function add(a, b) {

return a + b;

}

const mockAdd = jest.fn(add);

// 在测试中调用模拟函数

mockAdd(2, 3);

// 验证模拟函数的调用次数

expect(mockAdd.mock.calls.length).toBe(1);

// 验证模拟函数的参数

expect(mockAdd.mock.calls[0][0]).toBe(2);

expect(mockAdd.mock.calls[0][1]).toBe(3);

// 验证模拟函数的返回值

expect(mockAdd.mock.results[0].value).toBe(5);

在上面的示例中,我们使用jest.fn()创建了一个名为mockAdd的模拟函数,它代替了原始的加法函数add。我们可以使用mockAdd.mock.calls来获取模拟函数的调用次数和传入的参数,使用mockAdd.mock.results来获取模拟函数的返回值。

jest.spyOn()

jest.spyOn()也可以用于模拟函数的行为,但它的主要目的是监视函数的调用和返回值,而不是替换函数的实现。通过使用jest.spyOn(),我们可以在测试中监视实际函数的行为,以便更好地了解其在测试过程中的工作情况。

下面是一个使用jest.spyOn()的示例代码:

Javascript

// 一个简单的对象

const myObject = {

getValue() {

return 42;

}

};

// 使用 jest.spyOn() 监视对象的方法

const spyGetValue = jest.spyOn(myObject, 'getValue');

// 在测试中调用对象的方法

myObject.getValue();

// 验证监视器的调用次数

expect(spyGetValue).toBeCalledTimes(1);

// 验证监视器的返回值

expect(spyGetValue).toHaveReturnedWith(42);

在上面的示例中,我们使用jest.spyOn()监视了myObject对象的getValue方法。我们可以使用spyGetValue来验证监视器的调用次数和返回值。

两者的区别

- jest.fn()用于创建模拟函数,可以替代原始函数的实现。而jest.spyOn()用于监视函数的调用和返回值,不会替代原始函数的实现。

- jest.fn()返回的是一个模拟函数,我们可以通过模拟函数的属性来获取函数的调用次数、传入的参数和返回值。而jest.spyOn()返回的是一个监视器,我们可以使用监视器的方法来验证函数的调用次数和返回值。

在 Jest 中,jest.fn()jest.spyOn()是用于模拟函数和监视函数的两个重要方法。它们在测试中起到了不同的作用,jest.fn()用于创建模拟函数并控制其行为,而jest.spyOn()用于监视函数的调用和返回值。了解它们之间的区别可以帮助我们在测试中更好地使用它们。

希望这篇文章能够帮助您理解jest.fn()jest.spyOn()方法的区别,并在您的测试中选择合适的方法来满足您的需求。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号