我一直在读普普尼特手册,其中有一部分,我只是看不出重点,与嘲笑的特点(figure 9.18)有关。
在他们的例子中,有一个具体的方法从一个抽象的方法(最终被测试模仿)返回值。
不幸的是,2句话的解释并不能解释为什么这是有用的!据我所见,测试显然会通过,但在现实世界中,抽象方法不会被嘲笑,它实际上会失败?
我们是否打算删除抽象方法,并在具体方法中替换对它的调用?如果是的话,测试的重点是什么?为什么我们要用抽象的方法来混淆那些没有实际使用的特征呢?
我的最终问题是,为什么写测试是为了通过测试,如果在现实世界中使用,它会失败?如果有人能帮助我理解它,那就太感谢了!

最佳答案

我稍微修改了链接后面的示例,以显示测试实际测试的内容:

<?php
trait AbstractTrait
{
    public function concreteMethod()
    {
        // this is the only logic which is being tested in testConcreteMethod test
        $result = $this->abstractMethod() * 2;

        return $result;
    }

    /**
     * @return int
     */
    public abstract function abstractMethod();
}

class TraitClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $mock = $this->getMockForTrait('AbstractTrait');

        $mock->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(5));

        $this->assertEquals(10, $mock->concreteMethod());
    }
}

如果AbstractTrait::concreteMethod的实现发生变化,例如
    public function concreteMethod()
    {
        $result = $this->abstractMethod() * 3;

        return $result;
    }

测试将失败。
老实说,我从来没有在现实生活中用抽象的方法来使用trait,而是通过测试使用trait的类之一来测试trait的逻辑。在上面的例子中,如果不模拟抽象方法,就不可能单独测试AbstractTrait::concreteMethod

关于php - PHPUnit模拟特征,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33776294/

10-10 23:35