How to mock an exported const in jest

后端 未结 8 1774
借酒劲吻你
借酒劲吻你 2020-12-23 18:35

I have a file that relies on an exported const variable. This variable is set to true but if ever needed can be set to false manually

8条回答
  •  时光取名叫无心
    2020-12-23 19:35

    The most common scenario I needed was to mock a constant used by a class (in my case, a React component but it could be any ES6 class really).

    @Luke's answer worked great for this, it just took a minute to wrap my head around it so I thought I'd rephrase it into a more explicit example.

    The key is that your constants need to be in a separate file that you import, so that this import itself can be stubbed/mocked by jest.

    The following worked perfectly for me.

    First, define your constants:

    // src/my-component/constants.js
    
    const MY_CONSTANT = 100;
    
    export { MY_CONSTANT };
    

    Next, we have the class that actually uses the constants:

    // src/my-component/index.jsx
    
    import { MY_CONSTANT } from './constants';
    
    // This could be any class (e.g. a React component)
    class MyComponent {
      constructor() {
        // Use the constant inside this class
        this.secret = MY_CONSTANT;
        console.log(`Current value is ${this.secret}`);
      }
    }
    
    export default MyComponent
    

    Lastly, we have the tests. There's 2 use cases we want to handle here:

    1. Mock the generate value of MY_CONSTANT for all tests inside this file
    2. Allow the ability for a specific test to further override the value of MY_CONSTANT for that single test

    The first part is acheived by using jest.mock at the top of your test file.

    The second is acheived by using jest.spyOn to further spy on the exported list of constants. It's almost like a mock on top of a mock.

    // test/components/my-component/index.js
    
    import MyComponent from 'src/my-component';
    import allConstants from 'src/my-component/constants';
    
    jest.mock('src/my-component/constants', () => ({
      get MY_CONSTANT () {
        return 30;
      }
    }));
    
    it('mocks the value of MY_CONSTANT', () => {
      // Initialize the component, or in the case of React, render the component
      new MyComponent();
    
      // The above should cause the `console.log` line to print out the 
      // new mocked value of 30
    });
    
    it('mocks the value of MY_CONSTANT for this test,', () => {
      // Set up the spy. You can then use any jest mocking method
      // (e.g. `mockReturnValue()`) on it
      const mySpy = jest.spyOn(allConstants, 'MY_CONSTANT', 'get')
      mySpy.mockReturnValue(15);
    
      new MyComponent();
    
      // The above should cause the `console.log` line to print out the 
      // new mocked value of 30
    });
    

提交回复
热议问题