如何对构造函数采用一些参数的类的方法进行单元测试?

Sun*_*ary 6 php phpunit constructor unit-testing symfony

我有一类形式是这样的:

class A{  
    public function __constructor(classB b , classC c){
    //
    }

    public function getSum(var1, var2){
        return var1+var2;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试用例类是这样的:

use A;   
class ATest extends PHPUnit_Framework_TestCase{  

    public function testGetSum{  
        $a = new A();
        $this->assertEquals(3, $a->getSum(1,2));  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

但是,当我运行 phpunit 时,它会引发一些错误,例如:

Missing argument 1 for \..\::__construct(), called in /../A.php on line 5

即使我提供了参数,它也会抛出相同的错误,但在不同的文件中。
说,我实例化 $a = new A(new classB(), new classC());

然后,我得到了 classB 的构造函数的相同错误(classB 的构造函数与 A 的构造函数具有相似的形式)。

Missing argument 1 for \..\::__construct(), called in /../B.php on line 10

有没有其他方法,我可以测试功能或我缺少的东西。

我不想使用模拟 (getMockBuilder(),setMethods(),getMock()) 进行测试,因为它似乎违背了单元测试的全部目的。

Tom*_*ski 5

单元测试背后的基本思想是测试一个类/方法本身,而不是这个类的依赖项。为了对您的类进行单元测试,A您不应使用构造函数参数的真实实例,而应使用模拟PHPUnit提供了很好的创建方式,所以:

use A;   
class ATest extends PHPUnit_Framework_TestCase{  

    public function testGetSum{  
        $arg1Mock = $this->getMock('classB'); //use fully qualified class name
        $arg2Mock = $this->getMockBuilder('classC')
            ->disableOriginalConstructor()
            ->getMock(); //use mock builder in case classC constructor requires additional arguments
        $a = new A($arg1Mock, $arg2Mock);
        $this->assertEquals(3, $a->getSum(1,2));  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

注意:如果您不会在这里使用模拟,而是使用真正的 classB 和 classC 实例,那么它将不再是单元测试——它将是一个功能测试


Mat*_*teo 5

您可以使用methods 告诉 PHPUnit 您想要模拟指定类的哪个方法setMethods来自文档

setMethods(array $methods)可以在 Mock Builder 对象上调用,以指定要替换为可配置测试替身的方法。其他方法的行为不会改变。如果您调用setMethods(null),则不会替换任何方法。

因此,您可以在不替换任何方法的情况下构造您的类,但绕过构造,如下(工作)代码:

public function testGetSum(){
    $a = $this->getMockBuilder(A::class)
        ->setMethods(null)
        ->disableOriginalConstructor()
        ->getMock();

    $this->assertEquals(3, $a->getSum(1,2));
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助