简体   繁体   中英

How to mock plain object's dependency when unit testing with jest?

I can't find the way to mock object import when testing my ReactJs helper. All examples out there showing how to mock imported functions and nobody speak about mocking imported objects.

This base helper object I want to mock:

filters-state.helper.ts :

export const FiltersStateHelper = {
  toggleFilters: <T extends FiltersState>(state: T): T => ({
    ...state,
    isOpen: !state.isOpen
  })
};

I am using it in the state helper I'm testing:

search-view-state.helper.ts :

import { FiltersStateHelper } from 'shared/filters/helpers/filters-state.helper';

export const SearchViewStateHelper = {
  toggleFilters: <T extends SearchViewState>(state: T): T => ({
    ...state,
    filters: FiltersStateHelper.toggleFilters(state.filters)
  })
  //... more methods
};

And in the test mocking dependency is failing, probably because my helper's dependencies already resolved before I said jest what to mock:

search-view-state.helper.spec.ts :

import { SearchViewStateHelper as helper } from 'shared/search-view/helpers/search-view-state.helper';

describe('toggleFilters method', () => {
  const spy = jest.fn();
  jest.doMock('shared/filters/helpers/filters-state.helper', () => {
    return {
      toggleFilters: spy
    };
  });

  const state = {};

  it('should toggle filters', () => {
    helper.toggleFilters(state);
    expect(spy).toHaveBeenCalled();
  });
});

You can use jest.spyOn(object, methodName, accessType?) to spy on the toggleFilters method of FiltersStateHelper object.

Eg

filters-state.helper.ts :

type FiltersState = any;

export const FiltersStateHelper = {
  toggleFilters: <T extends FiltersState>(state: T): T => ({
    ...state,
    isOpen: !state.isOpen
  })
};

search-view-state.helper.ts :

import { FiltersStateHelper } from './filters-state.helper';

type SearchViewState = any;

export const SearchViewStateHelper = {
  toggleFilters: <T extends SearchViewState>(state: T): T => ({
    ...state,
    filters: FiltersStateHelper.toggleFilters(state.filters)
  })
  // ... more methods
};

search-view-state.helper.spec.ts :

import { SearchViewStateHelper as helper } from './search-view-state.helper';
import { FiltersStateHelper } from './filters-state.helper';

describe('toggleFilters method', () => {
  const state = { filters: { isOpen: false } };

  it('should toggle filters', () => {
    const spy = jest.spyOn(FiltersStateHelper, 'toggleFilters');
    helper.toggleFilters(state);
    expect(spy).toHaveBeenCalled();
    expect(spy).toBeCalledWith({ isOpen: false });
  });
});

Unit test result with 100% coverage:

 PASS  src/stackoverflow/58746881/search-view-state.helper.spec.ts
  toggleFilters method
    ✓ should toggle filters (6ms)

-----------------------------|----------|----------|----------|----------|-------------------|
File                         |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-----------------------------|----------|----------|----------|----------|-------------------|
All files                    |      100 |      100 |      100 |      100 |                   |
 filters-state.helper.ts     |      100 |      100 |      100 |      100 |                   |
 search-view-state.helper.ts |      100 |      100 |      100 |      100 |                   |
-----------------------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.833s, estimated 8s

Source code: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58746881

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM