我需要创建一个具有默认属性集的模拟对象,以便在实例化时可以在代码库中使用其他软件。
$mock = $this->getMock('MyClass', array(), array(), 'MyClass_Mock');
$mock->prop = 'foobar';
$myclassMock = new get_class($mock);
var_dump($myclassMock->prop); // NULL
// How can I make this dump 'foobar' ?
我正在测试确定、定位和实例化这些类的框架的一部分,因此注入(inject)模拟对象会破坏测试的目的。
我不需要模拟任何方法.. 只需像这样动态创建一个模拟类:
class MyClass_Mock extends MyClass {
public $prop = 'foobar';
}
编辑:简化示例
最佳答案
您对使用 Reflection 感觉如何?
$r = new ReflectionClass('MyClass');
$props = $r->getDefaultProperties();
$mock = new stdClass;
foreach ($props as $prop => $value) {
$mock->$prop = $value;
}
我自己并没有经常使用 Reflection,仅用于基本的内省(introspection)。我不确定您是否能够使用它完全模仿可见性等,但如果您继续沿着写入字符串和 eval
ing 的路线前进,我不明白为什么不这样做。
编辑:
出于好奇扫描了反射函数,如果您在字符串和 中动态构建类,则完全有可能使用虚拟方法完全模仿类,在适当的地方实现完整的可见性约束、常量和静态元素评估
它。
然而,当涉及到正确获取数据类型时,它看起来将是一个完整的任务,以真正完全支持每一种可能性(您需要代码来重建例如,来自数组的数组构造函数)
如果你沿着这条路走下去,祝你好运,它需要比我现在愿意节省的更多的脑力:)
这里有一些代码,您可以用常量做同样的事情,并以类似的方式创建空方法。
class Test
{
private static $privates = 'priv';
protected $protected = 'prot';
public $public = 'pub';
}
$r = new ReflectionClass('Test');
$props = $r->getDefaultProperties();
$mock = 'class MockTest {';
foreach ($props as $prop => $value) {
$rProp = $r->getProperty($prop);
if ($rProp->isPrivate()) {
$mock .= 'private ';
}
elseif ($rProp->isProtected()) {
$mock .= 'protected ';
}
elseif ($rProp->isPublic()) {
$mock .= 'public ';
}
if ($rProp->isStatic()) {
$mock .= 'static ';
}
$mock .= "$$prop = ";
switch (gettype($value)) {
case "boolean":
case "integer":
case "double":
$mock .= $value;
break;
case "string":
$mock .= "'$value'";
break;
/*
"array"
"object"
"resource"
*/
case "NULL":
$mock .= 'null';
break;
}
$mock .= ';';
}
$mock .= '}';
eval($mock);
var_dump(new MockTest);
关于php - 创建具有默认属性的模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330863/