how to change jest mock function return value in each test?

pashaplus picture pashaplus · Aug 18, 2017 · Viewed 57.9k times · Source

I have a mock module like this in my component test file

  jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => true,
    guidanceEnabled: () => true
  }));

these functions will be called in render function of my component to hide and show some specific feature.

I want to take a snapshot on different combinations of the return value of those mock functions.

for suppose I have a test case like this

 it('RowListItem should not render navigation and guidance options', () => {
    const wrapper = shallow(
      <RowListItem type="regularList" {...props} />
    );
    expect(enzymeToJson(wrapper)).toMatchSnapshot();
  });

to run this test case I want to change the mock module functions return values to false like this dynamically

jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => false,
    guidanceEnabled: () => false
  }));

because i am importing RowListItem component already once so my mock module wont re import again. so it wont change. how can i solve this ?

Answer

Andreas K&#246;berle picture Andreas Köberle · Aug 18, 2017

You can mock the module so it returns spies and import it into your test:

import {navigationEnabled, guidanceEnabled} from '../../../magic/index'

jest.mock('../../../magic/index', () => ({
    navigationEnabled: jest.fn(),
    guidanceEnabled: jest.fn()
}));

Then later on you can change the actual implementation using mockImplementation

navigationEnabled.mockImplementation(()=> true)
//or
navigationEnabled.mockReturnValueOnce(true);

and in the next test

navigationEnabled.mockImplementation(()=> false)
//or
navigationEnabled.mockReturnValueOnce(false);