Автор оригинала: whirlwind
Разработка на основе тестов, а не тестирование уже написанного. Разницу чуешь?
Вот пример твоего тестового кода:
Автор оригинала: whirlwind
PHP:
public function testGetBalance(){
...
$o = $this->getMock('PSO_LibertyReserve_Operator',
Array('createBalanceRequest','doRequest',
'analyseLrResponse','parseBalance'));
...
$o->expects($this->once())
->method('doRequest')
->will($this->returnValue('<bar></bar>'));
...
$amount = $o->getBalance($acc);
$this->assertEquals(100500,$amount);
}
На момент написания теста, если это tdd, у тебя можеть быть лишь интерфейс класс. А то, что ты моком заменяешь целый набор защищенных методов намекает на то, что класс написан раньше теста. К тому же концепция tdd, когда ты пишешь "грязный" код, чтобы тест прошел, а потом начинаешь этот код рефакторить, следя за тем, чтобы тест выполнялся у тебя нереализуема, т.к. у тебя тест связан с внутренней реализацией класса.
Автор оригинала: whirlwind
С чего ты взял что лучше? Этот метод был введен намеренно, для того что бы избавиться от зависимости транспортного уровня в тестах, которые никакого отношения к этому самому транспорту не имеют. Где в коде видно, что в работе не используется впрыск зависимого объекта? Стабы для того и придумали, что бы не заморачиваться эмулированием всей необходимой фикстуры а просто настроить 1 метод.
Ну можно настроить 1 метод "объекта-транспорта" и внедрить его в тестируемый объект. Это не сложнее.
-~{}~ 25.02.08 01:36:
Хочу резюмировать вышесказанное.
Одна из целей модульного тестирования - документирование, показать, как
пользоваться классом (а не как он устроен) . Притом показать в простом контексте, чтобы легко было понять (иначе человека можно сразу отправлять изучать реальный код
![Big Grin :D :D](/talk/styles/default/xenforo/smilies/biggrin.png)
). Поэтому если мы начинаем тестировать защищенные методы, то для того, чтобы понять тест, нам надо изучить внутреннюю реализацию тестируемого класса.
Ещё одна из целей тестирования - безболезненный рефакторинг. Но как только мы связываем тест с внутренний реализацией класса, он становиться затруднен или совсем невозможен.
Так что я однозначно против тестирования защищенных методов.
p.s. и против использования частичных моков
![Roll Eyes :rolleyes: :rolleyes:](/talk/styles/default/xenforo/smilies/rolleyes.png)