Jest mock module multiple times with different values

Add

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

Final tests

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

Demo: https://repl.it/repls/TrustingBelatedProprietarysoftware


To add to @Gigi's solution, I created another example, using jest.mock:

In the file multiplier.ts, multiplier is the exported function we want to test:

  // file: multiplier.ts

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

In the file get-number.ts, getNumber is the module we want to mock:

  // file: get-number.ts

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

Here is the test:

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

Note: for this to work, we need to use require to import multiplier.ts