模拟对象:实现接口或扩展类?

时间:2014-02-17 21:54:03

标签: php unit-testing phpunit

在我正在编写的库中,我想编写单元测试。我知道为了真正进行单元测试,一次只能测试一个对象。

我的问题直接与创建模拟对象有关。我正在编写一个XML库来将PHP数组转换为格式良好的XML,我决定通过创建容器对象来解决包含属性的问题。我没有预见到为类创建接口的理由,而不是创建它的模拟版本。

编写一个接口仅仅是为了模拟一个对象是否更好?特别是当接口只有getter时?或者是扩展基类并设置数据成员或覆盖getter以返回特定值的解决方案?或者有没有我考虑过的第三种解决方案?

感谢。

Per SenseException的建议,这里是对象结构:

EXMLWriter:获取EXMLData对象并运行验证器并编写XML。

EXMLData:$data是一个数组,其中$key => $value用于生成XML。

interface iEXMLData {
    public function getData();
    public function getRoot();
    public function getRuleset();
}

EXMLRuleSet:一组EXMLValidators的容器类。基本上是一个带有运行每个验证器的函数的数组。

EXMLValidator:对EXMLData的$ data成员运行任何检查。

interface iEXMLValidator {
    public function validate($data);
}

EXMLElement:EXMLWriter知道允许使用属性XML的特殊类。字面意思getData()getAttributes()

在EXMLWriter类中,我添加了这种类型的逻辑:

if(is_array($value)) {
    //code
}
elseif($value instanceof iEXMLData) {
    //code
}
elseif($value instanceof EXMLElement) {
    //code
}

因为EXMLElement只是数据的getter和setter,所以将它连接起来是没有意义的。

1 个答案:

答案 0 :(得分:1)

可以在类上使用phpUnit getMock方法。

ClassToTest.php

<?php
class ClassToTest {}

TestClassToTest.php

<?php
require './ClassToTest.php';

class TestClassToTest extends PHPUnit_Framework_TestCase
{
    public function testMocks()
    {
        $oMock = $this->getMock('ClassToTest');
        $this->assertTrue($oMock instanceof ClassToTest);

        $oC = new ClassToTest();
        $this->assertTrue($oC instanceof ClassToTest);
    }
}

运行phpUnit

PHPUnit 3.7.20 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 2.25Mb

OK (1 test, 2 assertions)