如何使用Karma,Jasmine和Istanbul指定测试应涵盖哪些功能/方法

时间:2016-03-15 13:06:17

标签: javascript unit-testing jasmine code-coverage istanbul

我正在试图弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该函数编写特定测试时所涵盖的函数。

PHPUnit doc中的以下示例显示了我尝试实现的非常好的内容:

  

可以在测试代码中使用@covers注释来指定哪个   测试方法想要测试的方法:

x.plot = min(x) - x

如果执行上述测试,则​​只会将函数/** * @covers BankAccount::getBalance */ public function testBalanceIsInitiallyZero() { $this->assertEquals(0, $this->ba->getBalance()); } 标记为已覆盖,而不是其他。

现在我的JavaScript测试中有一些实际的代码示例。此测试显示了我试图摆脱的不需要的行为:

getBalance

此测试会将函数it('Test get date range', function() { expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7); }); 标记为,但也标记从 getDateRange内部调用的任何其他函数。由于这个怪癖,我项目的实际代码覆盖率可能比报告的代码覆盖率低很多。

如何阻止此行为?有没有办法让Karma / Jasmine / Istanbul按照我想要的方式运行,或者我是否需要切换到另一个JavaScript测试框架?

1 个答案:

答案 0 :(得分:2)

我没有看到你提出的任何特殊原因。我说如果你的测试导致调用嵌套函数,那么函数也会被覆盖。您确实间接测试了这段代码,那么为什么不应该将其包含在代码覆盖率指标中呢?如果内部函数包含错误,即使它没有直接测试,你的测试也可以捕获它。

您可以使用特殊注释来注释您的代码,告诉伊斯坦布尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但我认为,如果您知道自己并不想要覆盖特定的执行路径,那么不要减少覆盖率,可能是因为要为它编写测试用例太难了。

另外,如果你关心你的低水平"功能单独测试,然后确保您的代码以模块化方式构建,以便您可以先自行测试。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖范围的套件。

正如评论中所建议的,模拟和依赖注入有助于使您的测试更加集中,但您基本上总是希望进行一些高级测试,以便检查这些部分的集成。如果你嘲笑一切,那么你永远不会测试实际的一起工作。