Как смоделировать зависимость простого объекта при юнит-тестировании с помощью jest? - PullRequest
0 голосов
/ 07 ноября 2019

Я не могу найти способ имитации импорта объектов при тестировании моего помощника ReactJ. Все примеры показывают, как имитировать импортированные функции, и никто не говорит о том, чтобы имитировать импортированные объекты.

Этот базовый вспомогательный объект, который я хочу смоделировать:

filters-state.helper.ts:

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

Я использую его в помощнике состояний, который я тестирую:

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

И в тесте зависимость от симуляции не работает, возможно, потому, что зависимости моего помощника уже разрешены до того, как я сказал, что шутить:

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

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете использовать jest.spyOn (object, methodName, accessType?) , чтобы шпионить за toggleFilters методом FiltersStateHelper объекта.

Например

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

Результат модульного теста со 100% покрытием:

 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

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58746881

...