【问题标题】:PHPUnit - Not seeing code coverage on simple functionPHPUnit - 没有看到简单函数的代码覆盖率
【发布时间】:2014-06-27 20:37:12
【问题描述】:

我正在尝试解决一个问题,即在我的测试中,我的断言通过了。但我的 expects() 都没有通过,我也没有看到在生成的代码覆盖率生成的 html 中执行覆盖率。

错误:方法应该被调用1次,实际被调用0次。

我从一个非常基本的例子开始(如下)。我肯定遗漏了 phpunit 的一些明显的东西,但显然我还没有想到。我仔细检查了我要测试的函数实际上是一个公共函数。

此时,我希望能够在生成的代码覆盖率 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);
}

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    您看不到任何代码覆盖率,因为您从未实际执行 returnVal() 函数。您的测试套件使用了一个不调用原始函数的 Mock,而是引用了一个 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() 调用。这将导致代码覆盖显示这些行已执行。

    【讨论】:

    • 我接受了你的回答,因为执行真正的代码可以解决问题。但是,由于各种依赖关系,我无法做到这一点。
    • 问题最终出现了,我在打字时摇头。由于 getMockBuilder 调用中的 TYPO。即 MyClass 与 Myclass (实际上更模糊)。没有产生错误,所以花了一段时间才找到..
    • 如果您使用的是 PHP 5.5+,您可以在对 $this->getMockBuilder() 的调用中使用 MyClass::class 而不是 'MyClass'。我已经开始在任何地方都这样做,以消除我的拼写错误,同时也便于使用我的 IDE 的重构工具来重命名类并(有时)将它们移动到新的命名空间中。
    猜你喜欢
    • 2017-05-31
    • 2012-05-04
    • 2012-01-18
    • 2012-01-14
    • 2012-08-04
    • 2018-05-29
    • 1970-01-01
    • 2011-05-27
    • 2017-02-22
    相关资源
    最近更新 更多