如何用Kent Beck的书TDD中的Java代表PHP?

时间:2013-04-28 09:41:31

标签: java php unit-testing tdd phpunit

我自学PHP和TDD(使用PHP和PHPUnit)。我正在完成Kent Beck的书Test-driven Development by Example

例如,在第3章中,他建议用于等式测试:

public void testEquality() {
    assertTrue(new Dollar(5).equals(new Dollar(5)));
}

在Dollar课程中,他重写了equals方法:

public boolean equals(Object object) {
   Dollar dollar = (Dollar) object;
   return amount == dollar.amount;
}

我不熟悉PHP,但我不知道如何将其转换为PHP。

对于我尝试的第一个功能:

public function testEquality(){
    $a = new Dollar(5);
    $this->assertTrue($a->equals($b = new Dollar(5)));
}

这是正确的轨道吗?正如我所知道的PHP现在必须将对象分配给变量,对吗?在那条路线之前,我探索了

$this->assertTrue(new Dollar(5)->equals(new Dollar(5))); 

引发了语法错误。然而,令人惊讶的是重构早期的testMultiplication方法并传递了$this->assertEquals(new Dollar(10), $five->times(2));

equals方法而言,这对我来说是完全陌生的,我只是不知道从哪里开始。

如何在PHP中正确地重构上述内容?如果我能做对,我想我可以处理其余的例子。

作为一个附带问题,有没有人知道这个Money示例是否已经在PHP中接近并且代码在那里?

1 个答案:

答案 0 :(得分:1)

您的代码如下

public boolean equals(Object object) {
   Dollar dollar = (Dollar) object;
   return amount == dollar.amount;
}

这意味着这一点(行换行)

  1. 定义一个名为equals的新方法,该方法将返回truefalse,并期望类型为Object的对象(在Java中表示每个对象)作为参数< / LI>
  2. Object类型的对象转换为Dollar (wiki on type conversion)类型,现在您可以使用此对象的公共方法和属性
  3. 将当前上下文中的属性amount与来自dollar(来自object
  4. 的属性进行比较

    您现在可以逐行将方法转换为PHP without the need of typecasting

    public function equals($object)
    {
        return $this->amount == $object->amount;
    }
    

    可以使用不同的方法声明:

    public function equals(Dollar $object)
    

    这样您就可以确定只比较两个相同类型的对象。

    用法类似于Java用法:

    $a = new Dollar(5);
    $b = new Dollar(5);
    if ($a->equals($b))
        print "TRUE";
    else
        print "FALSE";
    

    要了解有关PHP中对象比较的更多信息,最好阅读manual