乐闻世界logo
搜索文章和话题

How to reset or clear a spy in Jest?

4 个月前提问
3 个月前修改
浏览次数27

1个答案

1

在使用Jest进行单元测试时,创建spy有助于跟踪函数的调用情况,包括被调用的次数和调用时的参数等。但是在一个测试结束后,为了保证每个测试的独立性和准确性,通常需要重置或清除这些spy。Jest提供了几种方法来重置或清除spy。

1. mockClear()

mockClear() 可以清除mock函数的调用记录,但不会影响其实现。这意味着mock函数的返回值或实现不会被改变,仅仅是清空了调用的历史记录。

示例代码:

javascript
const myFunction = jest.fn(); myFunction(); myFunction(); console.log(myFunction.mock.calls.length); // 输出 2 myFunction.mockClear(); console.log(myFunction.mock.calls.length); // 输出 0

2. mockReset()

mockReset() 会清除mock函数的调用记录,并且重置其实现。如果之前对mock函数进行了特殊的实现(比如返回特定值等),使用mockReset()后这些都会被重置。

示例代码:

javascript
const myFunction = jest.fn(() => "return value"); console.log(myFunction()); // 输出 "return value" myFunction.mockReset(); console.log(myFunction()); // 输出 undefined 因为实现被重置

3. mockRestore()

如果mock是通过jest.spyOn()创建的,那么除了要清除调用记录和重置实现之外,还可能需要将被spy的函数恢复到原始状态。mockRestore() 方法可以恢复被spy的函数到它最初的实现。

示例代码:

javascript
const utils = { fetchData: () => "original data" }; const spy = jest.spyOn(utils, 'fetchData'); console.log(utils.fetchData()); // 输出 "original data" spy.mockImplementation(() => "mocked data"); console.log(utils.fetchData()); // 输出 "mocked data" spy.mockRestore(); console.log(utils.fetchData()); // 输出 "original data"

在实际测试中,通常在afterEach或者beforeEach钩子中使用这些方法来保证测试的独立性和清晰性。

示例代码:

javascript
describe('myFunction tests', () => { const myFunction = jest.fn(); afterEach(() => { myFunction.mockReset(); }); test('test 1', () => { myFunction(); expect(myFunction).toHaveBeenCalled(); }); test('test 2', () => { expect(myFunction).not.toHaveBeenCalled(); }); });

通过这种方式,可以确保每个测试之间不会互相影响,每次测试开始前都是干净的状态。

2024年6月29日 12:07 回复

你的答案