首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用jest进行单元测试时,如何模拟普通对象的依赖关系?

在使用jest进行单元测试时,如何模拟普通对象的依赖关系?
EN

Stack Overflow用户
提问于 2019-11-07 18:37:09
回答 1查看 321关注 0票数 0

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

我想模拟的这个基础辅助对象:

filters-state.helper.ts

代码语言:javascript
运行
复制
export const FiltersStateHelper = {
  toggleFilters: <T extends FiltersState>(state: T): T => ({
    ...state,
    isOpen: !state.isOpen
  })
};

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

search-view-state.helper.ts

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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();
  });
});
EN

Stack Overflow用户

发布于 2019-11-08 12:58:19

您可以使用jest.spyOn(object, methodName, accessType?)来窥探FiltersStateHelper对象的toggleFilters方法。

例如。

filters-state.helper.ts

代码语言:javascript
运行
复制
type FiltersState = any;

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

search-view-state.helper.ts

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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%覆盖率的单元测试结果:

代码语言:javascript
运行
复制
 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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58746881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档