繁体   English   中英

如何在PHP中使用依赖项对方法进行单元测试?

[英]How to unit test a method with dependencies in PHP?

我有一个带有一些逻辑的方法,而且我不确定如何对其进行单元测试。 因为这是此特定方法的单元测试,所以它应在不连接数据库的情况下运行。 我读到了有关存根和样机的信息,但找不到将它们应用于这种情况的方法。

我想强制Client:GetClient返回具有正确属性的客户端对象,以便测试每个逻辑分支。


class ClientType {
    function GetClientType($id) {

    $objClient = Client::GetClient($id);

    if ($objClient->Returning == 1) {
        return 'returning';
    }
    else {
        return 'normal';
    }
    }

这是我想到的测试


class ResourceTest extends PHPUnit_Framework_TestCase {
    function testGetClientType() {
        $objClientType = new ClientType();
        $this->assertTrue($objClientType->GetClientType(100), 'normal');
    }
}

问题是依赖项$ objClient = Client :: GetClient($ id); GetClient将从数据库中拉出客户端,但是我需要用Stub替换它,以便单元测试可以正常工作而无需访问数据库。

结论

  • 如果您有类似所示的代码:对其进行重构并使用“依赖注入”。
  • 如果您有旧版代码或不想重构,请尝试以下解决方案: http : //sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html

  • 使用PHPUnit,您可以执行

      $class = $this->getMockClass(
          'Client',          /* name of class to mock     */
          array('getClient') /* list of methods to mock   */
        );
        $class::staticExpects($this->any())
              ->method('getClient')
              ->will($this->returnValue('foo'));
    

    通常,您希望避免使用静态方法:


    更新后编辑

    PHPUnit还可以对硬编码的依赖项进行存根。 看到

    但是,由于您现在已经注意到测试静态和硬编码的依赖项是一个难题,因此建议您使用注入到ClientType中的真实对象删除硬编码的依赖项和静态调用。

    另一种选择是使用http://antecedent.github.io/patchwork (不附带它),

    是一个PHP库,可以在运行时重新定义用户定义的函数和方法,以纯PHP 5.3代码轻松复制功能runkit_function_redefine,除其他功能外,还可以用测试双精度替换静态和私有方法。

    尝试模拟解决此类问题。 我不知道PHP,但是在这种情况下我们使用Java和C#进行模拟。

    编辑

    很抱歉,我没有看到您遇到模拟问题。 通常,对于Mocks,您会告诉他们您对他们的期望,他们也会做出同样的反应。 LSV原理正在模拟中使用。 至于PHP,很抱歉,我不知道要使用哪种工具进行模拟以及如何使用它们

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM