我通常在我的对象上使用getter和setter方法,我可以通过使用以下代码操作它们来在SimpleTest中将它们作为模拟对象进行测试:
Mock::generate('MyObj');
$MockMyObj->setReturnValue('getPropName', 'value')
但是,我最近开始使用魔术拦截器(__set()__ get())并访问属性,如下所示:
$MyObj->propName = 'blah';
但是我很难通过使用该技术使模拟对象访问特定属性。
还有一些在MockObjects上设置属性的特殊方法。
我尝试过:
$MockMyObj->propName = 'test Value';
但这似乎不起作用。不确定是否是我的测试主题,模拟,魔术拦截器或SimpleTest导致该属性无法访问。
所以,总结一下:
我可以在我的模拟对象上模拟方法,但是我无法模拟模拟对象的类属性。是否可以在Simpletest中设置Mock对象的属性?
欢迎任何建议。
答案 0 :(得分:3)
回答我自己的问题......
是的,可以设置使用魔术拦截器的对象模拟的属性 - 只需设置拦截器方法的返回值,就像使用任何其他方法一样。
在模拟对象上模拟截获的属性的SimpleTest示例:
此对象
class MyObj
{
public function __set($name, $value)
{
$props[$name] = $value;
}
public function __get($name)
{
return $props[$name] = $value;
}
}
客户端(经过测试的聚合器类)可以访问类似的属性
$MyObj->propName = 'blah';
echo $MyObj->propName; //prints blah
它可以像这样嘲笑
Mock::generate('MyObj');
$MockMyObj = new MockMyObj();
$MockMyObj->setReturnValue('__get', 'test property value', array('propName'));
//...later on...
echo $MockMyObj->propName; //prints "test property value"
P.S。 这里有一些关于模拟的文档: http://www.simpletest.org/en/mock_objects_documentation.html
P.P.S
之前我确实尝试过,但是我的实验在我的代码中被错误所掩盖。