“增强PHP”入门

时间:2011-12-05 22:17:46

标签: php unit-testing

我希望将测试框架合并到我正在构建的项目中并遇到Enhance PHP我喜欢但我在线查找相关信息有些困难,因为“增强php”是一种常用的短语。

是否有人使用此框架可能会指向我一些有用的指南?您是否使用过您认为更好的单元测试框架?

提前致谢。

在回应Gotzofter时,这是要测试的课程:

<?php
include_once('EnhanceTestFramework.php');

class ExampleClass
{
    private $OtherClass;

    function __construct($mock = null)
    {
        if ($mock == null)
            $this->OtherClass = new OtherExampleClass();
        else
            $this->OtherClass = $mock;
    }

    public function doSomething()
    {
        return $this->OtherClass->getSomething(1, 'Arg2');
    }
}

class OtherExampleClass
{
    public function getSomething()
    {
        return "Something";
    }
}

class ExampleClassTests extends \Enhance\TestFixture
{
    public function setUp() 
    {
    }

    public function tearDown()
    {
    }

    public function verifyWithAMock() 
    {
        $mock = \Enhance\MockFactory::createMock('OtherExampleClass');
        $mock->addExpectation(
            \Enhance\Expect::method('getSomething')
                ->with(1, 'Arg2')
                ->returns('Something')
                ->times(1)
            );
        $target = new ExampleClass($mock);
        $result = $target->doSomething();
        \Enhance\Assert::areIdentical("Something", $result);

        $mock->verifyExpectations();
    }
}

\Enhance\Core::runTests();

查看ExampleClass的构造函数。

因为enhance-php的网站示例通过调用new ExampleClass($ mock)来注入$ mock对象,所以我不得不更改我的ExampleClass构造函数来处理$ mock作为输入参数。

对于我想要使用框架进行单元测试的所有类,我是否必须处理此问题?

感谢。

3 个答案:

答案 0 :(得分:3)

此:

function __construct()
{
   $this->OtherClass = new OtherExampleClass;
}

应该是:

function __construct($otherClass)
{
   $this->OtherClass = $otherClass;
}

你的模拟在测试中从未被注入:

   $target = new ExampleClass($mock);

答案 1 :(得分:1)

无论您使用什么测试框架,我都会建议您使用针对预期类或接口的类型提示。

<?php
class ExampleClass
{
  private $OtherClass;  // OtherClass instance

  public function __construct(OtherClass $OtherClass=null)
  {
      // ...
  }
}

我不是专家,但如果没有为特定依赖项提供实例,我没有看到让每个类调用 new 的问题。当然,您也可以采用使用setter方法配置依赖关系的方法。

<?php
class class ExampleClass
{
  private $OtherClass;  // OtherClass instance

  public function setOtherClass(OtherClass $OtherClass)
  {
    $this->OtherClass = $OtherClass;
  }
}

示例代码中的 ExampleClass 甚至没有定义 ExampleDependencyClassTests 中的 doSomething 方法,但是如果我明白了正确看起来像增强PHP 并没有强迫你采取特定的依赖注入风格。您可以根据需要编写测试类,例如,如果采用上面提到的setter方法方法,则可以将示例模拟代码更改为

<?php
class ExampleDependencyClassTests extends \Enhance\TestFixture
{
    public function verifyWithAMock() 
    {
        $mock = \Enhance\MockFactory::createMock('ExampleDependencyClass');
        $mock->addExpectation(
            \Enhance\Expect::method('getSomething')
            ->with(1, 'Arg2')
            ->returns('Something')
            ->times(1)
        );
        $target = new ExampleClass();
        $target->setExampleDependencyClass($mock);
        $result = $target->doSomething();
        $mock->verifyExpectations();
    }
}

当然,对 ExampleClass 进行适当的修改是很有意义的。

<?php
class ExampleClass
{
    private $ExampleDependencyClass;

    public function addTwoNumbers($a, $b)
    {
        return $a + $b;
    }

    public function setExampleDependencyClass(
        ExampleDependencyClass $ExampleDependecyClass
    ) {
        $this->ExampleDependecyClass = $ExampleDependecyClass;
    }

    public function doSomething($someArg)
    {
        return 'Something';
    }
}

我已经与 PHPUnit 进行了相当多的工作,老实说,你必须面对与 Mocks 相同的挑战。我的2美分,尝试在没有 Mocks 的情况下为您的测试建模;如果可能的话;)

答案 2 :(得分:0)

有一个名为Testing Your PHP Codebase With Enhance PHP的NetTuts教程,肯定会帮助您入门。

还有Quick Start Guide on Enhance PHP