4

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

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

但是,我最近开始使用魔法拦截器(__set() __get())并访问如下属性:

$MyObj->propName = 'blah';

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

那么是否有一些特殊的方法可以在 MockObjects 上设置属性。

我试过做:

 $MockMyObj->propName = 'test Value';

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

所以,总结一下:

可以在我的模拟对象上模拟方法,但是在模拟模拟对象的类属性时遇到了麻烦。是否可以在 Simpletest 中设置模拟对象的属性?

欢迎任何建议。

4

1 回答 1

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"

PS这里有更多关于模拟的文档: http ://www.simpletest.org/en/mock_objects_documentation.html

聚苯乙烯

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

于 2010-04-23T20:00:27.437 回答