Bil*_*Tom 12 javascript unit-testing code-coverage jasmine istanbul
我试图弄清楚如何限制我的测试,以便覆盖记者只考虑在专门为该功能编写测试时所涵盖的功能.
PHPUnit文档中的以下示例显示了我尝试实现的非常好的内容:
可以在测试代码中使用@covers注释来指定测试方法要测试的方法:
/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
Run Code Online (Sandbox Code Playgroud)
如果执行上述测试,则只将该功能getBalance标记为已覆盖,而不是其他.
现在来自我的JavaScript测试的一些实际代码示例.此测试显示了我试图摆脱的不需要的行为:
it('Test get date range', function()
{
expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});
Run Code Online (Sandbox Code Playgroud)
此测试将将函数标记getDateRange为已覆盖,但也 标记从内部调用的任何其他函数getDateRange.由于这个怪癖,我项目的实际代码覆盖率可能比报告的代码覆盖率低很多.
我怎么能阻止这种行为?有没有办法让Karma/Jasmine/Istanbul按照我想要的方式运行,或者我是否需要切换到另一个JavaScript测试框架?
我看不出你问的有什么特别的原因。我想说,如果您的测试导致调用嵌套函数,那么该函数也会被覆盖。您确实是在间接测试该代码段,那么为什么不应该将其包含在代码覆盖率指标中呢?如果内部函数包含错误,您的测试可以捕获它,即使它不是直接测试它。
您可以用特殊注释来注释您的代码,以告诉伊斯坦布尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但我认为这更多是相反的,如果您知道不希望覆盖特定的执行路径,则不要减少覆盖范围,也许是因为为其编写测试用例太难了。
另外,如果您关心单独测试的“低级”功能,那么请确保您的代码以模块化方式构建,以便您可以首先自行测试这些功能。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖范围的套件。
正如评论中所建议的,模拟和依赖项注入可以帮助您的测试更加集中,但您基本上总是希望进行一些高级测试,在其中检查这些部分的集成。如果你模拟一切,那么你就永远不会测试实际一起工作的部分。