嘲笑模拟模块多次使用不同的值

Adr*_*scu 4 javascript unit-testing jest

我有一个要测试的函数,该函数使用导入的模块:

var a = require('./a');

function add(b) {
  return a + b;
}

module.exports = add;
Run Code Online (Sandbox Code Playgroud)

a模块在此示例中返回一个数字,但是在我的真实项目中,我将该数字用作不时手动更改的配置对象。

var a = 1;
module.exports = a;
Run Code Online (Sandbox Code Playgroud)

add功能的测试如下所示:

describe('add', () => {

  it('should add the mock number 1 to 2', () => {
    jest.setMock('./a', 1);
    const add = require('./add');
    expect(add(2)).toBe(3);
  });

  it('should add the mock number 2 to 2', () => {
    jest.setMock('./a', 2);
    const add = require('./add');
    expect(add(2)).toBe(4);
  });
});
Run Code Online (Sandbox Code Playgroud)

第一个测试通过,第二个测试失败,因为它继承自第一个模拟。有什么方法可以a多次模拟模块?

我想要一个不暗示重构add功能,而是专注于多次模拟该模块的解决方案。(在我的真实项目中是一个配置文件)

您可以在此处使用以下代码:https : //repl.it/@adyz/NocturnalBadComma

小智 6

beforeEach(() => {
    jest.resetModules();
});
Run Code Online (Sandbox Code Playgroud)

最终测试

describe('add', () => {

    beforeEach(() => {
        jest.resetModules();
    });

    it('should add the mock number 5 to 2', () => {
        jest.setMock('./a', 5);
        const add = require('./add');
        expect(add(2)).toBe(7);
    });

    it('should add the mock number 2 to 2', () => {
        jest.setMock('./a', 2);
        const add = require('./add');
        expect(add(2)).toBe(4);
    });
});
Run Code Online (Sandbox Code Playgroud)

演示:https : //repl.it/repls/TrustingBelatedProprietarysoftware