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()) 进行测试,因为它似乎违背了单元测试的全部目的。
单元测试背后的基本思想是测试一个类/方法本身,而不是这个类的依赖项。为了对您的类进行单元测试,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 实例,那么它将不再是单元测试——它将是一个功能测试
您可以使用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)
希望这有帮助