Recentemente stavo TDDing un metodo di fabbrica. Il metodo consisteva nel creare un oggetto semplice o un oggetto avvolto in un decoratore. L'oggetto decorato potrebbe essere di uno dei diversi tipi, tutti estendendo la StrategyClass.
Nel mio test volevo verificare se la classe dell'oggetto restituito è come previsto. È facile quando viene restituito un semplice oggetto, ma cosa fare quando è racchiuso in un decoratore?
Scrivo codice in PHP in modo da poter usare ext/Reflection
per scoprire una classe di oggetti avvolti, ma mi è sembrato di complicare troppo le cose, e in qualche modo di nuovo le regole del TDD.
Invece ho deciso di introdurre getClassName()
che restituirebbe il nome della classe dell'oggetto quando chiamato da StrategyClass. Tuttavia, quando viene chiamato dal decoratore, restituisce il valore restituito con lo stesso metodo nell'oggetto decorato.
Qualche codice per renderlo più chiaro:
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();
}
}
E un test 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
Il mio punto qui è: va bene introdurre tali metodi, che non hanno altro uso che rendere più semplici i test unitari? In qualche modo non mi sembra giusto.