2008-10-04 39 views
4

我試圖用__get和__set方法模擬對象時發生問題(使用simpletest)。模擬測試和PHP的魔術__get方法

寫__get的模擬響應聽起來並不正確 - 測試看起來與實現緊密相關。任何測試建議,還是應該完全避免魔術方法?

+0

你能舉個例子說明你在哪裏遇到麻煩嗎?就__get和__set而言,它們具有相對較小的使用範圍,不會給系統增加不必要的複雜性。 – gradbot 2008-10-08 15:52:19

回答

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'; 
} 

一有點笨重,但它工作。另一方面,我認爲你最好避免使用它們......我正在使用的大型公司系統大量使用它們,對於理解/可視化/調試/做任何事情來說,這是一場噩夢!