Geçenlerde bir fabrika yöntemi TDD yapıyordum. Yöntem ya düz bir nesne ya da bir dekoratöre sarılmış bir nesne yaratmaktı. Dekore edilmiş nesne, StrategyClass'ı genişleten çeşitli türlerden biri olabilir.
Testimde, iade edilen nesnenin sınıfının beklendiği gibi olup olmadığını kontrol etmek istedim. Düz nesne işletim sistemi geri döndüğünde bu kolaydır, ancak bir dekoratör içine sarıldığında ne yapmalı?
Ben ext/Reflection
sarılmış nesne sınıfı bulmak için kullanabilirsiniz böylece PHP kod , ama bana aşırı karmaşık şeyler gibi görünüyordu ve biraz TDD kuralları agains.
Bunun yerine getClassName()
StrategyClass den çağrıldığında nesnenin sınıf adını döndürmek tanıtmak karar verdi . Ancak dekoratörden çağrıldığında, aynı yöntemle dekore edilmiş nesnede döndürülen değeri döndürür.
Daha açık hale getirmek için bazı kodlar:
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();
}
}
Ve bir PHPUnit testi
/**
* @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
Demek istediğim şu ki: Birim testleri kolaylaştırmaktan başka bir faydası olmayan bu yöntemleri tanıtmak uygun mudur? Bir şekilde bana doğru gelmiyor.