Недавно я был TDDing заводским методом. Метод заключался в создании либо простого объекта, либо объекта, завернутого в декоратор. Декорированный объект может быть одного из нескольких типов, расширяющих StrategyClass.
В моем тесте я хотел проверить, соответствует ли класс возвращаемого объекта ожидаемому. Это легко, когда возвращается простой объект os, но что делать, если он помещен в декоратор?
Я пишу код на PHP, чтобы использовать ext/Reflectionкласс обернутых объектов, но мне показалось, что он слишком усложняет вещи и несколько напоминает правила TDD.
Вместо этого я решил представить, getClassName()что при вызове из StrategyClass будет возвращаться имя класса объекта. Однако при вызове из декоратора он возвращает значение, возвращаемое тем же методом в декорированном объекте.
Некоторый код, чтобы сделать его более понятным:
interface StrategyInterface {
public function getClassName();
}
abstract class StrategyClass implements StrategyInterface {
public function getClassName() {
return \get_class($this);
}
}
abstract class StrategyDecorator implements StrategyInterface {
private $decorated;
public function __construct(StrategyClass $decorated) {
$this->decorated = $decorated;
}
public function getClassName() {
return $this->decorated->getClassName();
}
}
И тест PHPUnit
/**
* @dataProvider providerForTestGetStrategy
* @param array $arguments
* @param string $expected
*/
public function testGetStrategy($arguments, $expected) {
$this->assertEquals(
__NAMESPACE__.'\\'.$expected,
$this->object->getStrategy($arguments)->getClassName()
)
}
//below there's another test to check if proper decorator is being used
Моя точка зрения здесь: нормально ли вводить такие методы, которые не имеют другого применения, кроме как облегчить юнит-тесты? Почему-то мне это не кажется правильным.