尝试使用__get
和__set
方法(使用simpletest)模拟对象时遇到问题。
为__get
编写模拟响应并不正确 - 测试似乎与实现紧密相关。任何测试建议,还是我应该完全避免使用魔法?
答案 0 :(得分:3)
我遇到了同样的问题,并在SimpleTest测试用例中找到了解决方案:
来自mock_objects_test.php:
class ClassWithSpecialMethods {
function __get($name) { }
function __set($name, $value) { }
function __isset($name) { }
function __unset($name) { }
function __call($method, $arguments) { }
function __toString() { }
}
Mock::generate('ClassWithSpecialMethods');
...剪辑...
function testReturnFromSpecialAccessor() {
$mock = new MockClassWithSpecialMethods();
$mock->setReturnValue('__get', '1st Return', array('first'));
$mock->setReturnValue('__get', '2nd Return', array('second'));
$this->assertEqual($mock->first, '1st Return');
$this->assertEqual($mock->second, '2nd Return');
}
function testcanExpectTheSettingOfValue() {
$mock = new MockClassWithSpecialMethods();
$mock->expectOnce('__set', array('a', 'A'));
$mock->a = 'A';
}
有点笨重,但它确实有效。另一方面,我认为你最好避开它们......我正在研究的大型企业系统大量使用它们,理解/可视化/调试/做任何事情都是一场噩梦!