开玩笑中的模拟导入模块
#javascript #测试 #jest #mock

使用JavaScript时,导入外部或内部库是如此普遍。有时为了在我们的项目中实现模块化和可重复性,有时是为了避免实施第三方已经开发的功能。

今天,我们将在测试代码时如何使用Jest Suite来模拟这些库。

首先,让我们假设我们有以下代码:

Maths.js

export const sum = (a, b) => a + b

export const substract = (a, b) => a - b;

app

import { sum, substract } from './math.mjs'

const sumResult = sum(2, 1);
const substractResult = substract(2, 1);

鉴于该代码,我们可以有两种情况:

  1. 模拟完整的“导入”,即完整库。
  2. 模拟只有一种方法,但保留另一个方法的原始代码

所以让我们看看每种情况:

嘲笑完整的图书馆

要模拟完整的库,我们只需要模拟其中一种方法(另一种将保留为undefined),否则我们可以模拟所有方法。模拟技术是冷漠的,这取决于我们正在测试的。

// mock only one method
jest.mock('../math', () => ({
    sum: jest.fn(),
}));

// mock only one method (with implementation)
jest.mock('../math', () => ({
    sum: jest.fn().mockImplementation(() => '5'),
}));

// mock all methods
jest.mock('../math', () => ({
    sum: jest.fn(),
    substract: jest.fn(),
}));

仅嘲笑一种导入的方法

正如我们之前所说的,我们只能导入其中一种方法,并保留其余方法的原始实现

在下面的示例中,我们嘲笑substrack方法,但请保留库其余部分的原始实现,在这种情况下,add方法

jest.mock('../math', () => {
    const originalMathLib = jest.requireActual('../math');

    return {
        ...originalMathLib,
        substract: jest.fn(),
    };
});

在任何其他import之前,将此代码包括在我们的测试文件的顶部非常重要。这些模拟必须是我们文件的第一行。