【问题标题】:Jest - How to get coverage for mocked classes and implementationsJest - 如何获得模拟类和实现的覆盖率
【发布时间】:2018-10-25 04:13:45
【问题描述】:

我目前正在做一个项目,我正在使用 Jest 进行单元测试和代码覆盖。

一切正常,除了模拟类/方法的覆盖范围。我似乎没有得到想要的覆盖结果。我试图在 Jest 文档中找到一些内容并在线搜索答案,但我似乎找不到任何相关内容。

问题是,当我使用模拟实现(例如./services/__mocks__/UserService.js)时,实际实现(./services/UserService.js)导致覆盖率为 0%。这是一个合乎逻辑的结果,因为实现被模拟覆盖了。

我可以通过在实际服务中的每个方法上使用 /* istanbul ignore next */ 来解决这个问题,或者只是将实际服务添加到 Jest 设置文件中的 coveragePathIgnorePatterns 属性中,并让它为所有模拟类生成覆盖范围,但我想知道是否有任何方法可以让 Jest 自动使用模拟实现来生成覆盖结果。

模拟类/函数和代码覆盖率的方法是什么?

提前致谢!

【问题讨论】:

  • 通常像UserService.js 这样的服务会在依赖它的代码的单元测试中被模拟,但也会有自己的单元测试来确保它正常工作。

标签: unit-testing mocking code-coverage jestjs


【解决方案1】:

正如文档中所说的for manual mocks,只有当您明确调用jest.mock('./services/UserService'); 之类的东西时,您才会使用./services/__mocks__/UserService.js

如果您想为./services/UserService 编写测试,请确保在此测试之前不要使用jest.mock('./services/UserService');

【讨论】:

  • 在 OP 的描述中,他们提到:“一切正常,除了模拟类/方法的覆盖范围”我个人很好奇我如何模拟一个方法(例如使用 jest.fn() )但是然后开玩笑说不需要告诉我我缺少该方法的覆盖范围)我在 Vue 组件中有一个方法可以处理我已经充分测试的事件,我觉得直接添加另一个单元测试针对该方法的测试增加了不必要的耦合,没有额外的好处。
  • 刚刚再次登录并注意到这一点。现在我更清楚这是如何工作的,我不应该嘲笑我想要报道的东西。我现在正在使用 jest.mock 为模块定义模拟,因此在实际服务中导入的所有内容都包含我需要的模拟。现在完美运行。不过感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2017-01-05
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多