У меня возникают проблемы при попытке имитировать объекты методами __get и __set (используя самый простой).
Написание имитационных ответов для __get нехорошо - тесты кажутся слишком тесно связанными с реализацией. Какие-нибудь рекомендации по тестированию, или мне просто полностью избегать магических методов?
Я использовал систему, подобную той, которую предложил penfold, но установка множества фиктивных возвратов для __get и __set с разными параметрами, казалось, вводила слишком много реализации в тесты






У меня была такая же проблема, и я нашел решение в тестовых примерах 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, у них относительно небольшая область использования, которая не добавляет ненужной сложности системе.