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