PHPUnit 模拟特征

PHPUnit mocking traits

我一直在阅读 PHPUnit 手册,其中有一部分与 mocking traits (figure 9.18) 有关,我只是看不出其中的意义 (figure 9.18)。

在他们的示例中,有一个具体方法 returns 来自抽象方法的值(最终被测试模拟)。

不幸的是,两句话的解释没有解释为什么这有用!据我所知,测试显然会通过,但在现实世界中,抽象方法不会被模拟,它实际上会失败?

我们是否打算删除抽象方法并在具体方法中替换对它的调用?如果是这样,测试的重点是什么?为什么我们用实际上没有使用的抽象方法来混淆特征?

我的最终问题是,为什么编写的测试在测试中通过,如果在现实世界中使用,它会失败?如果有人能帮我理解一下,将不胜感激!

我稍微修改了 link 后面的示例以揭示测试实际测试的内容:

<?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;
    }

测试将失败。

老实说,我从未在现实生活中使用具有抽象方法的特征,并通过测试使用该特征的 类 之一来测试特征的逻辑。如上例所示,如果不模拟抽象方法,就不可能单独测试 AbstractTrait::concreteMethod