2016-03-15 70 views
8

我想弄清楚如何限制我的测试,以便覆盖记者只考虑测试时覆盖的函数为该功能编写,具体为如何使用Karma,Jasmine和Istanbul来指定测试应涵盖哪些函数/方法

PHPUnit doc下面的例子显示相当不错的我尽量做到:

注解@covers可以在测试代码被用于指定 方法(S)的测试方法要测试:

/** 
* @covers BankAccount::getBalance 
*/ 
public function testBalanceIsInitiallyZero() 
{ 
    $this->assertEquals(0, $this->ba->getBalance()); 
} 

如果上述测试将被执行,仅功能getBalance将被标记为覆盖,并且没有其它。

现在来自我的JavaScript测试的一些实际代码示例。该测试显示了不受欢迎的行为,我试图摆脱的:

it('Test get date range', function() 
{ 
    expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7); 
}); 

此测试将标记功能getDateRange作为覆盖,而且还从内部getDateRange叫任何其他功能。由于这个怪癖,我的项目的实际代码覆盖率可能比报告的代码覆盖率低很多。

我该如何阻止这种行为?有没有办法让Karma/Jasmine/Istanbul像我想要的那样工作,还是我需要切换到另一个JavaScript测试框架?

+0

想到的是使用依赖注入和模拟来减少实际生产代码的调用次数。 – henrikmerlander

+0

我同意henrikmerlander。此外,如果您正在使用真正的函数调用而不是间接在测试方法内部进行模拟,那么您也正在测试该函数 – ejosafat

回答

2

我没有看到你要问什么特别的原因。我会说,如果你的测试导致一个嵌套函数被调用,那么函数也被覆盖。你确实间接测试了这段代码,那么为什么不应该包含在代码覆盖率指标中呢?如果内部函数包含一个bug,即使它不是直接测试,你的测试也可以捕获它。

您可以标注有特殊的评论你的代码告诉伊斯坦布尔忽略某些路径: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但是这更多的相反,我认为,不,如果你知道你不希望特定的执行路径是减少覆盖覆盖,也许是因为编写测试用例太难了。

另外,如果你关心隔离测试你的“低层次”的功能,然后确保你的代码是模块化的方式构造,使得你可以自己先测试这些。您也可以设置不同的测试运行配置,这样您就可以拥有一套仅测试基本逻辑并报告覆盖范围的套件。

正如评论所说,嘲讽和依赖注入有助于使你的测试更加集中,但基本上你总是希望有一些,你检查这些部件整合在一起,高水平的测试。如果你嘲笑一切,那么你永远不会测试一起工作的实际作品。

相关问题