PHPUnit - 没有看到简单函数的代码覆盖

时间:2014-05-10 00:22:21

标签: php phpunit

我正在尝试解决一个问题,在我的测试中,我的断言通过..但是我的期望()都没有通过,也没有看到生成的代码覆盖范围内的覆盖执行生成的html。

错误:预计方法被调用1次,实际上被称为0次。

我从一个非常基本的例子(下面)开始。我肯定错过了一些显而易见的问题,显然我还没有把我的脑袋包裹起来。我仔细检查了我试图测试的功能实际上是一个公共功能。

此时,我希望能够在生成的代码覆盖率html中看到一些覆盖率。

非常感谢任何想法。

public function returnVal()
{
  return 5;
}

public function test_returnVal()
{
    $testVal = 5;
    $controllerMock = $this->getMockBuilder('MyClass')
        ->setMethods(null)
        ->disableOriginalConstructor()
        ->getMock();

    $controllerMock->expects($this->any())
        ->method('testReturnVal')
        ->with($testVal);

    $testResult = $controllerMock->testReturnVal($testVal);
    $this->assertEquals($testResult, $testVal);
}

1 个答案:

答案 0 :(得分:1)

您没有看到任何代码覆盖,因为您从未实际执行returnVal()函数。你的测试套件使用了一个不调用原始函数的Mock,但它引用了一个模拟函数(testReturnVal)。

$controllerMock->expects($this->any())
    ->method('testReturnVal')
    ->with($testVal);

测试时,Mocks可以方便地隐藏外部依赖关系并保持已知状态。但是,对于简单的函数(例如,添加2个数字),您只需创建对象并调用代码即可。

根据您的情况,只需在测试代码中添加一个额外的测试:

public function test_RealReturnVal()
{
     $TestObject = new MyClass();
     $this->assertEquals(5, $TestObject->returnVal());
}

这个新测试实际上会调用您的实际代码并执行returnVal()调用。这将导致代码覆盖率将这些行显示为已执行。