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

标签 javascript unit-testing jasmine code-coverage istanbul

我正在尝试弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该功能专门编写测试时覆盖的功能。

下面的例子来自PHPUnit doc很好地展示了我试图实现的目标:

The @covers annotation can be used in the test code to specify which method(s) a test method wants to test:

/**
 * @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 测试?

最佳答案

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

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

此外,如果您关心单独测试的“低级”功能,请确保您的代码以模块化方式构建,以便您可以先自行测试这些功能。您还可以设置不同的测试运行配置,这样您就可以拥有一个仅测试基本逻辑并报告其覆盖率的套件。

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

关于javascript - 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些功能/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012202/

相关文章:

unit-testing - 最喜欢的 Postgresql 函数单元测试方法?

c# - 从屏幕继承的单元测试 View 模型 (Caliburn.Micro)

angular - rxjs 如何期望 observable 抛出错误

javascript - Jasmine - 如何模拟 history.pushState 和假事件发射?

javascript - 为什么我应该为 GraphQL 突变响应类型使用接口(interface)?

javascript - 使用 AJAX 将头像上传到服务器

javascript - Material Design - 使用 jQuery 设置输入

javascript - 切换大小写以检查字符串是否包含子字符串

java - 测试两个目录树是否相等

Angular/RxJS 6 - 如何对 next() 触发的指令抛出异常进行单元测试