我正在尝试解决一个问题,在我的测试中,我的断言通过..但是我的期望()都没有通过,也没有看到生成的代码覆盖范围内的覆盖执行生成的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);
}
答案 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()调用。这将导致代码覆盖率将这些行显示为已执行。