在PHPUnit中使用模拟对象测试实际的类方法

时间:2016-09-27 13:36:29

标签: php unit-testing phpunit

我想要做的是:创建一个不执行__constructor()的Mock对象,但是DOES拥有编码时的所有方法(不会被模拟为返回null)。

The docs说:

  

"默认情况下,原始类的所有方法都替换为   只返回null的虚拟实现(不调用   原方法)。使用will($this->returnValue())方法,用于   例如,您可以配置这些虚拟实现以返回a   调用时的值。"

那不是我想要的。我不想强制方法返回已知值。我想测试方法本身,因此需要一个功能实例化的类,但需要一个禁用的构造函数。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我为类本身编写了测试用例,在不使用Mocks的情况下,根据所需参数返回数据。模拟用于外部引用此类,需要知道函数Bar()返回Foo,因此等待该响应的类会正确处理结果。

鉴于这个非常简单的PHP类:

<?php
class CATEGORY_SCOPE
{
    public $CategoryName;
    public $CategoryNo;

    function __construct($CategoryNo = NULL, $CategoryName = NULL)
    {
        $this->CategoryName = $CategoryName;
        $this->CategoryNo   = $CategoryNo;
    }

    protected function SetCategoryName($Name)
    {
        $this->CategoryName = Name;
    }
}
?>

然后我会测试它:

<?php
require_once(substr(__FILE__, 0, -5));  // strip '.test' extension
class TEST_CATEGORY_SCOPE extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testObjectCreation()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $this->assertInstanceOf('CATEGORY_SCOPE', $CategoryInfo);
    }

    public function testConstructFieldOrder()
    {
        $CategoryInfo = new CATEGORY_SCOPE(1500, 'Category Name');
        $this->assertEquals(1500, $CategoryInfo->CategoryNo);
        $this->assertEquals('Category Name', $CategoryInfo->CategoryName);
    }

    public function testConstructDefaults()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $this->assertNull($CategoryInfo->CategoryNo);
        $this->assertNull($CategoryInfo->CategoryName);
    }

    public function testSetCategoryName()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $CategoryInfo->SetCategoryName('New Name');
        $this->assertEquals('New Name', $CategoryInfo->CategoryName);
    }
}
?>

这将测试类本身是否有效,我可以设置某些值。显然这是一个简单的例子。现在,当某些东西使用这个类时,我仍然可以对目录设置进行目录测试,但这里有介绍。

对于你的问题,我们假设我有类FOO()接受CATEGORY_SCOPE作为构造函数中的参数。您将模拟CATEGORY_SCOPE类,并设置内部Bar()函数以返回一些数据,无论CATEGORY_SCOPE类的处理如何。

<?php
class FOO
{
    public $ReturnValue
    function __construct($CategoryScope)
    {
        $this->ReturnValue = $CategoryScope->Bar();
    }
}
?>

通过模拟CATEGORY_SCOPE类,使Bar()函数始终返回5(某些值对您的代码有意义),然后您可以测试FOO类是否按预期工作。

<?php
require_once(substr(__FILE__, 0, -5));  // strip '.test' extension
class TEST_FOO extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testObjectCreation()
    {
        $FooInfo = new FOO();
        $this->assertInstanceOf('FOO', $FooInfo);
    }

    public function testFoo()
    {
        // Set Up the Mock so Bar() returns 5 using your mock library

        ... <- Actual code for the mock goes here

        $FooInfo = new FOO($CategoryMock);
        $this->assertEquals(5, $FooInfo->Bar());
    }
}
?>