Jest模拟模块多次使用不同的值

时间:2018-04-04 11:52:52

标签: javascript unit-testing jest

我有一个我想测试的功能,这个功能使用导入的模块:

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

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

module.exports = add;

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

var a = 1;
module.exports = a;

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);
  });
});

第一次测试通过,第二次测试失败,因为它继承自第一个模拟。有没有办法多次模拟a模块?

我想要一个解决方案并不意味着重构add函数,而是专注于多次模拟该模块。 (在我的真实项目中是配置文件)

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

2 个答案:

答案 0 :(得分:4)

添加

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

最终测试

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);
    });
});

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

答案 1 :(得分:0)

要添加到@Gigi的解决方案中,我使用jest.mock创建了另一个示例:

在文件multiplier.ts中,multiplier是我们要测试的导出函数:

  // file: multiplier.ts

  import {getNumber} from './get-number'
  const multiplier = (num:number) => num * getNumber()
  export {multiplier}

在文件get-number.ts中,getNumber是我们要模拟的模块:

  // file: get-number.ts

  const getNumber = () => 2
  export {getNumber}

这是测试:

  // file: multiplier.test.ts

  // import { multiplier } from "./multiplier"  // <-- this will not work
  
  describe("[multiplier]", () => {
    beforeEach(() => {
      jest.resetModules()
    })
  
    it('should mock getNumber so that getNumber return 3', () => {
      const mockReturn = 3
  
      jest.mock( './get-number', () => (
        { getNumber: jest.fn(()=>mockReturn) }
      ))
  
      const { multiplier } = require('./multiplier')
      expect(multiplier(2)).toBe(6)
    })
  
    it('should mock getNumber so that getNumber return 4', () => {
      const mockReturn = 4
  
      jest.mock( './get-number', () => (
        { getNumber: jest.fn(()=>mockReturn) }
      ))
  
      const { multiplier } = require('./multiplier')
      expect(multiplier(2)).toBe(8)
    })
  
    it('should mock getNumber so that getNumber return 5', () => {
      const mockReturn = 5
  
      jest.mock( './get-number', () => (
        { getNumber: jest.fn(()=>mockReturn) }
      ))
  
      const { multiplier } = require('./multiplier')
      expect(multiplier(2)).toBe(10)
    })
  })

注意:要执行此操作,我们需要使用require导入multiplier.ts