我有一类这样的表单:
class A{
public function __constructor(classB b , classC c){
//
}
public function getSum(var1, var2){
return var1+var2;
}
}
我的测试用例类是这样的:
use A;
class ATest extends PHPUnit_Framework_TestCase{
public function testGetSum{
$a = new A();
$this->assertEquals(3, $a->getSum(1,2));
}
}
但是当我运行 phpunit 时,它会抛出一些错误,例如:
在第 5 行的/../A.php 中调用的\..\::__construct() 缺少参数 1
即使我提供了参数,它也会在不同的文件中抛出相同的错误。
说,我实例化
$a = new A(new classB(), new classC());
然后,对于 classB 的构造函数,我得到了相同的错误(classB 的构造函数与 A 的构造函数具有相似的形式)。
在/../B.php 第 10 行调用的\..\::__construct() 缺少参数 1
有没有其他方法,我可以测试我缺少的功能或其他东西。
我不想使用 mock (getMockBuilder(),setMethods(),getMock()) 进行测试,因为它似乎违背了单元测试的全部目的。
最佳答案
单元测试背后的基本思想是测试类/方法本身,而不是此类的依赖项。为了对 A
类进行单元测试,您不应使用构造函数参数的真实实例,而应使用 mocks。 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));
}
}
注意:如果您不会在这里使用 mock,而是使用真正的 classB 和 classC 实例,那么它将不再是单元测试 - 它将是功能测试
关于php - 如何对构造函数接受一些参数的类的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390074/