// PHP5 class BadDollar { protected $amount; public function __construct($amount=0) { $this->amount = (float)$amount; } public function getAmount() { return $this->amount; } public function add($dollar) { $this->amount += $dollar->getAmount(); } } class Work { protected $salary;public function __construct() { $this->salary = new BadDollar(200);} public function payDay() { return $this->salary; } } class Person { public $wallet; } function testBadDollarWorking() { $job = new Work; $p1 = new Person; $p2 = new Person; $p1->wallet = $job->payDay(); $this->assertEqual(200, $p1->wallet->getAmount()); $p2->wallet = $job->payDay(); $this->assertEqual(200, $p2->wallet->getAmount()); $p1->wallet->add($job->payDay()); $this->assertEqual(400, $p1->wallet->getAmount()); //this is bad — actually 400 $this->assertEqual(200, $p2->wallet->getAmount()); //this is really bad — actually 400 $this->assertEqual(200, $job->payDay()->getAmount()); } 那么, bug是什么呢?如果不能上面的代码例子中直观地发现问题,这里有个提示:雇员对象$p1和对象$p2使用着同一个BadDollar对象实例。
Value Object PHP5 Unit Test 1) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase 2) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase FAILURES!!!