【发布时间】:2016-06-30 22:43:58
【问题描述】:
我试图弄清楚如何限制我的测试,以便覆盖率报告者只考虑在为该函数编写测试时专门覆盖的函数。
PHPUnit doc 中的以下示例很好地展示了我尝试实现的目标:
@covers 注解可以在测试代码中用来指定哪个 测试方法要测试的方法:
/**
* @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 测试?
【问题讨论】:
-
想到的是使用依赖注入和模拟来减少对实际生产代码的调用次数。
-
我同意 henrikmerlander 的观点。此外,如果您在被测方法中间接使用真正的函数调用而不是模拟,那么您也在测试该函数
-
非常好的问题。例如,用 phpunit 进行测试,我们有 /** @coverage **/ phpdoc tag ;)
标签: javascript unit-testing jasmine code-coverage istanbul