Skip to content

七、模拟函数(Mock Functions)

7.1 创建模拟函数

  • jest.fn() :使用jest.fn()创建一个模拟函数,模拟函数可以记录调用次数、参数等信息。
javascript
const mockFunction = jest.fn();
mockFunction();
expect(mockFunction).toHaveBeenCalled();
const mockFunction = jest.fn();
mockFunction();
expect(mockFunction).toHaveBeenCalled();
  • 自定义返回值:可以通过mockReturnValue或mockResolvedValue(用于异步函数)来设置模拟函数的返回值。
javascript
const mockFunction = jest.fn().mockReturnValue(42);
const result = mockFunction();
expect(result).toBe(42);
const mockFunction = jest.fn().mockReturnValue(42);
const result = mockFunction();
expect(result).toBe(42);

7.2 模拟模块

  • jest.mock() :使用jest.mock()来自动模拟一个模块,Jest 会自动生成一个模拟模块,其中所有导出的函数都被替换为模拟函数。
javascript
// module.js
export function originalFunction() {
    return 'original';
}
// test.js
jest.mock('./module');
const { originalFunction } = require('./module');
test('mocked function', () => {
    originalFunction.mockReturnValue('mocked');
    expect(originalFunction()).toBe('mocked');
});
// module.js
export function originalFunction() {
    return 'original';
}
// test.js
jest.mock('./module');
const { originalFunction } = require('./module');
test('mocked function', () => {
    originalFunction.mockReturnValue('mocked');
    expect(originalFunction()).toBe('mocked');
});
  • 手动模拟模块:除了自动模拟,也可以手动创建一个模拟模块,然后通过jest.mock()指定使用该模拟模块。
javascript
// __mocks__/module.js
export function originalFunction() {
    return'mocked';
}
// test.js
jest.mock('./module');
const { originalFunction } = require('./module');
test('manually mocked function', () => {
    expect(originalFunction()).toBe('mocked');
});
// __mocks__/module.js
export function originalFunction() {
    return'mocked';
}
// test.js
jest.mock('./module');
const { originalFunction } = require('./module');
test('manually mocked function', () => {
    expect(originalFunction()).toBe('mocked');
});

7.3 模拟函数的使用场景

  • 隔离测试:通过模拟依赖项,将测试对象与外部依赖隔离开来,确保测试的独立性和准确性。
  • 测试异步操作:模拟异步操作的结果,以便在测试中控制和验证异步行为。
  • 测试边缘情况:通过模拟不同的输入和返回值,测试函数在各种边缘情况下的表现。

Released under the MIT License.