Baru-baru ini saya menggunakan metode pabrik. Metodenya adalah membuat objek polos, atau objek yang dibungkus dekorator. Objek yang didekorasi dapat berupa salah satu dari beberapa tipe yang semuanya memperluas StrategyClass.
Dalam pengujian saya, saya ingin memeriksa, apakah kelas objek yang dikembalikan seperti yang diharapkan. Itu mudah ketika objek polos dikembalikan, tetapi apa yang harus dilakukan ketika dibungkus dengan dekorator?
Saya kode dalam PHP sehingga saya bisa gunakan ext/Reflection
untuk mencari tahu kelas objek yang dibungkus, tetapi bagi saya sepertinya hal-hal yang rumit, dan agak menentang aturan TDD.
Sebaliknya saya memutuskan untuk memperkenalkan getClassName()
yang akan mengembalikan nama kelas objek ketika dipanggil dari StrategyClass. Namun ketika dipanggil dari dekorator, itu akan mengembalikan nilai yang dikembalikan dengan metode yang sama pada objek yang didekorasi.
Beberapa kode untuk membuatnya lebih jelas:
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();
}
}
Dan tes 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
Maksud saya di sini adalah: apakah boleh memperkenalkan metode seperti itu, yang tidak memiliki kegunaan lain selain membuat unit test lebih mudah? Entah bagaimana rasanya tidak enak bagiku.