是否可以在Simpletest中设置Mock对象的属性

时间:2010-04-23 10:49:43

标签: properties mocking simpletest

我通常在我的对象上使用getter和setter方法,我可以通过使用以下代码操作它们来在SimpleTest中将它们作为模拟对象进行测试:

Mock::generate('MyObj');
$MockMyObj->setReturnValue('getPropName', 'value')

但是,我最近开始使用魔术拦截器(__set()__ get())并访问属性,如下所示:

$MyObj->propName = 'blah';

但是我很难通过使用该技术使模拟对象访问特定属性。

还有一些在MockObjects上设置属性的特殊方法。

我尝试过:

 $MockMyObj->propName = 'test Value';

但这似乎不起作用。不确定是否是我的测试主题,模拟,魔术拦截器或SimpleTest导致该属性无法访问。

所以,总结一下:

可以在我的模拟对象上模拟方法,但是我无法模拟模拟对象的类属性。是否可以在Simpletest中设置Mock对象的属性?

欢迎任何建议。

1 个答案:

答案 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

之前我确实尝试过,但是我的实验在我的代码中被错误所掩盖。