4
我試圖用__get和__set方法模擬對象時發生問題(使用simpletest)。模擬測試和PHP的魔術__get方法
寫__get的模擬響應聽起來並不正確 - 測試看起來與實現緊密相關。任何測試建議,還是應該完全避免魔術方法?
我試圖用__get和__set方法模擬對象時發生問題(使用simpletest)。模擬測試和PHP的魔術__get方法
寫__get的模擬響應聽起來並不正確 - 測試看起來與實現緊密相關。任何測試建議,還是應該完全避免魔術方法?
我有同樣的問題,發現在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';
}
一有點笨重,但它工作。另一方面,我認爲你最好避免使用它們......我正在使用的大型公司系統大量使用它們,對於理解/可視化/調試/做任何事情來說,這是一場噩夢!
你能舉個例子說明你在哪裏遇到麻煩嗎?就__get和__set而言,它們具有相對較小的使用範圍,不會給系統增加不必要的複雜性。 – gradbot 2008-10-08 15:52:19