最近,我正在开发一种工厂方法。该方法是创建一个普通对象或包装在装饰器中的对象。装饰对象可以是全部扩展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
我的意思是:可以引入这样的方法,除了使单元测试更容易之外,没有其他用途吗?不知何故我觉得不对。