Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit模仿特征_Php_Unit Testing_Phpunit_Traits - Fatal编程技术网

PHPUnit模仿特征

PHPUnit模仿特征,php,unit-testing,phpunit,traits,Php,Unit Testing,Phpunit,Traits,我一直在阅读PHPUnit手册,其中有一部分,我就是看不出它的意义,与模仿特征有关() 在他们的示例中,有一个具体的方法,它从一个抽象方法(最终被测试模拟)返回值 不幸的是,两句话的解释并不能解释为什么这是有用的!就我所见,测试显然会通过,但在现实世界中,抽象方法不会被嘲笑,它实际上会失败吗 我们是否要删除抽象方法,并在具体方法中替换对它的调用?如果是,测试的重点是什么?为什么我们要用抽象的方法把这些特征弄得乱七八糟,而这些方法实际上并没有被使用 我的最终问题是,为什么编写的测试要通过测试,而如

我一直在阅读PHPUnit手册,其中有一部分,我就是看不出它的意义,与模仿特征有关()

在他们的示例中,有一个具体的方法,它从一个抽象方法(最终被测试模拟)返回值

不幸的是,两句话的解释并不能解释为什么这是有用的!就我所见,测试显然会通过,但在现实世界中,抽象方法不会被嘲笑,它实际上会失败吗

我们是否要删除抽象方法,并在具体方法中替换对它的调用?如果是,测试的重点是什么?为什么我们要用抽象的方法把这些特征弄得乱七八糟,而这些方法实际上并没有被使用


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

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

<?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());
    }
}
考试将失败


老实说,我从未在真实生活中使用trait和抽象方法,并通过测试使用trait的一个类来测试trait的逻辑。在上面的例子中,如果不模仿抽象方法,就不可能单独测试
AbstractTrait::concreteMethod

啊,我明白了,这个例子是针对在现实世界中实际使用抽象方法的特征的?我想我是在想抽象方法仅仅是测试所需要的(因此不适用于现实世界)。谢谢:)我不确定这是否是一个好的实践,假设你只是测试这个特性,而不是测试使用它的班级,有一天你决定将它从那个班级中删除。。。所以你的代码突然停止了原来的行为,你不知道为什么,因为你没有在真正的类上测试它。因此,在使用trait功能时,一定要测试类的行为。
    public function concreteMethod()
    {
        $result = $this->abstractMethod() * 3;

        return $result;
    }