Vor kurzem habe ich eine Factory-Methode getestet. Die Methode bestand darin, entweder ein einfaches Objekt oder ein Objekt in einem Dekorateur zu erstellen. Das dekorierte Objekt kann von einer von mehreren Arten sein, die alle StrategyClass erweitern.
In meinem Test wollte ich überprüfen, ob die Klasse des zurückgegebenen Objekts den Erwartungen entspricht. Das ist einfach, wenn normale Objekte zurückgegeben werden, aber was ist zu tun, wenn sie in einem Dekorateur verpackt sind?
Ich codiere in PHP, damit ich ext/Reflection
eine Klasse von umschlossenen Objekten finden kann, aber es schien mir, dass es überkomplizierte Dinge sind und den TDD-Regeln in gewisser Weise widersprechen.
Stattdessen habe ich beschlossen, ein getClassName()
Objekt einzuführen , das den Klassennamen des Objekts zurückgibt, wenn es von StrategyClass aufgerufen wird. Wenn es jedoch vom Dekorator aufgerufen wird, gibt es den Wert zurück, der von derselben Methode in dem dekorierten Objekt zurückgegeben wird.
Code zur Verdeutlichung:
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();
}
}
Und ein PHPUnit-Test
/**
* @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
Mein Punkt hier ist: Ist es in Ordnung, solche Methoden einzuführen, die keinen anderen Nutzen haben, als Unit-Tests einfacher zu machen? Irgendwie fühlt es sich für mich nicht richtig an.