繁体   English   中英

用笑话进行单元测试时如何模拟普通对象的依赖关系?

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

在测试我的 ReactJs 助手时,我找不到模拟 object 导入的方法。 那里的所有示例都显示了如何模拟导入的函数,没有人谈论 mocking 导入的对象。

这个基础助手 object 我想模拟:

filters-state.helper.ts

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

我在我正在测试的 state 助手中使用它:

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

在测试中 mocking 依赖失败,可能是因为在我开玩笑说要模拟什么之前我的助手的依赖已经解决:

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

您可以使用jest.spyOn(object, methodName, accessType?)来监视FiltersStateHelper object 的toggleFilters方法。

例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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