【发布时间】:2015-02-22 18:49:33
【问题描述】:
我一直在研究 Kent Beck 的测试驱动开发示例,并用 PHP 重写示例作为学习语言的练习。
第 2 章,“Degenerate Objects”,描述了重写类方法和单元测试以确保每次调用方法时(在示例中,它被称为 times)都返回一个新对象(在示例中,该对象称为 Dollar) )。
到目前为止,我的班级是这样的:
class Dollar {
public $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function times($multiplier) {
return new Dollar($this->amount *= $multiplier);
}
}
我的测试是这样的:
public function testTimes()
{
$five = new Dollar(5);
$product = $five->times(2);
$this->assertEquals(10, $product->amount);
$product = $five->times(3);
$this->assertEquals(15, $product->amount);
}
第一个断言通过。 第二个断言失败,返回 30。
从概念上讲,我知道它为什么返回 30,但我不确定如何重写 times 方法以确保正确实例化并返回新的 Dollar 对象。如何重写 times 方法?为什么我第二次调用$five->times(3)时$product不是一个新的对象实例?
编辑 - 我在 SO 上找到了一些用 PHP 重写的书的例子,但我没有遇到任何描述这种情况的例子(或者对我来说澄清了为什么 $product 没有分配新对象它)。
【问题讨论】:
-
因为你的第二个断言也是针对 $5,而不是针对 $product
-
感谢@MarkBaker - 原始测试(用 Java 写在书中)做了第二个断言指向 $5(在 Java 中它写为: product = Five.times(3) ),所以我对 $product 对象实例做了同样的事情。我尽可能地紧跟在后面。它应该引用什么?
标签: php unit-testing oop phpunit