Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 模拟对象:实现接口还是扩展类?_Php_Unit Testing_Phpunit - Fatal编程技术网

Php 模拟对象:实现接口还是扩展类?

Php 模拟对象:实现接口还是扩展类?,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,在我正在编写的库中,我想编写单元测试。我知道为了真正进行单元测试,一次只能测试一个对象 我的问题直接涉及到创建模拟对象。我正在编写一个XML库来将PHP数组转换为格式良好的XML,我决定通过创建一个容器对象来解决属性的包含问题。除了创建类的模拟版本之外,我没有预见到为类编写接口的理由 编写一个接口仅仅是为了模拟一个对象,特别是当接口只有getter时,是否更好?或者是扩展基类并设置数据成员或重写getter以返回特定值的解决方案?还是有第三种解决方案我没有考虑 谢谢 根据SenseeExcept

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

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

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

谢谢

根据SenseeException的建议,对象结构如下:

EXMLWriter:获取EXMLData对象并运行验证程序,然后写入XML

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

interface iEXMLData {
    public function getData();
    public function getRoot();
    public function getRuleset();
}
EXMLRuleSet:一组ExmlValidator的容器类。基本上是一个数组,具有运行每个验证器的函数

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,所以将其连接起来是没有意义的。

phpUnit方法可以在类上使用

ClassToTest.php


我以前试过,但是它导致了所有的
instanceof
检查失败。这很奇怪。我相信get mock会使mock成为被mock类的一个子类。我可能自己测试一下,只是为了验证一下。我可能在那里犯了一个错误。当我遇到这个问题时,我只是创建了一个模拟对象,但那是用于另一个项目。是的,我刚刚测试过,它工作正常。我将把我的代码粘贴到答案中以供参考。它与我的意思不完全相同,但无论如何我都会尝试。您的代码建议它应该工作;很可能我在另一个项目中做了一些不正确的事情。实际上你测试了一个对象的更小部分:一个方法。你有没有任何例子来展示你的对象结构是什么样子的?我的意思是测试与一个对象交互。我将编辑我的问题以包括一些示例。
<?php
class ClassToTest {}
<?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 3.7.20 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 2.25Mb

OK (1 test, 2 assertions)