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

Javascript 如何使用Karma、Jasmine和Istanbul指定测试应涵盖哪些功能/方法,javascript,unit-testing,jasmine,code-coverage,istanbul,Javascript,Unit Testing,Jasmine,Code Coverage,Istanbul,我正试图找出如何限制我的测试,以便coverage reporter仅在专门为某个函数编写测试时考虑该函数 下面的例子展示了我试图实现的目标: @covers注释可以在测试代码中用于指定 方法:测试方法要测试的测试方法: 如果要执行上述测试,则只有函数getBalance将被标记为已覆盖,而没有其他函数 现在是我的JavaScript测试中的一些实际代码示例。此测试显示了我试图摆脱的不想要的行为: it('Test get date range', function() { expect

我正试图找出如何限制我的测试,以便coverage reporter仅在专门为某个函数编写测试时考虑该函数

下面的例子展示了我试图实现的目标:

@covers注释可以在测试代码中用于指定 方法:测试方法要测试的测试方法:

如果要执行上述测试,则只有函数
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测试?

我看不出你问的有什么特别的原因。我想说,如果您的测试导致调用嵌套函数,那么该函数也会被覆盖。您确实是在间接测试这段代码,那么为什么不将其包括在代码覆盖率度量中呢?如果内部函数包含bug,您的测试可以捕获它,即使它没有直接进行测试

您可以使用特殊注释对代码进行注释,以告知伊斯坦布尔忽略某些路径: 但我认为这是相反的,如果你知道你不想覆盖某个特定的执行路径,那么就不要减少覆盖率,可能是因为为它编写测试用例太难了

此外,如果您关心隔离测试的“低级”函数,那么请确保您的代码是以模块化的方式构造的,以便您可以首先自己测试这些函数。您还可以设置不同的测试运行配置,这样您就可以有一个套件,只测试基本逻辑并报告其覆盖范围


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

想到的是使用依赖注入和模拟来减少对实际生产代码的调用。我同意henrikmerlander的观点。此外,如果您在测试方法中使用实函数调用而不是模拟,那么您也在测试该函数,这是一个非常好的问题。例如,使用phpunit进行测试时,我们有/***@coverage**/phpdoc tag;)
it('Test get date range', function()
{
    expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});