최근에 나는 공장 방법을 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
내 요점은 다음과 같습니다. 단위 테스트를 쉽게하기 위해 다른 방법을 사용하지 않는 그러한 방법을 도입해도됩니까? 어쨌든 그것은 나에게 옳지 않은 느낌입니다.