เมื่อเร็ว ๆ นี้ฉันกำลังใช้วิธีการจากโรงงาน TDDing วิธีการคือการสร้างวัตถุธรรมดาหรือวัตถุห่อในมัณฑนากร วัตถุตกแต่งอาจเป็นหนึ่งในหลายประเภทที่ขยาย StrategyClass
ในการทดสอบของฉันฉันต้องการตรวจสอบว่าคลาสของวัตถุที่ส่งคืนเป็นไปตามที่คาดไว้หรือไม่ มันง่ายมากที่จะส่งคืนอ็อบเจ็กต์ธรรมดา แต่จะทำอย่างไรเมื่อมันถูกห่อไว้ในมัณฑนากร?
ฉันใช้รหัสใน 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
จุดของฉันที่นี่คือ: มันตกลงที่จะแนะนำวิธีการดังกล่าวที่ไม่มีประโยชน์อื่น ๆ กว่าที่จะทำให้การทดสอบหน่วยง่ายขึ้น? อย่างใดมันก็ไม่รู้สึกถูกต้องสำหรับฉัน