Ich hatte das gleiche Problem und fand die Lösung in den SimpleTest-Testfällen:
Aus 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');
... snip ...
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';
}
Ein bisschen klobig, aber es funktioniert. Andererseits denke ich, dass es besser ist, sie zu vermeiden... das große Unternehmenssystem, an dem ich arbeite, verwendet sie stark und es ist ein Alptraum zu verstehen/visualisieren/debuggen/etwas damit zu tun!