php - 如何对构造函数接受一些参数的类的方法进行单元测试?

标签 php unit-testing symfony constructor phpunit

我有一类这样的表单:

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 类进行单元测试,您不应使用构造函数参数的真实实例,而应使用 mocksPHPUnit 提供了创建它们的好方法,因此:

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/

相关文章:

php - Symfony2 的 FOSElasticaBundle。如何配置连接到集群?

php - 使用 WSSE 的身份验证提供程序

javascript - symfony 2 twig 访问数组 javascript 索引

php - 尝试通过在 Laravel 5.2 中实现 ArraySerializer 来删除 Fractal 中的数据

php - 如何将 jquery 变量传递给 drupal (ajax)

unit-testing - Angular 2.0.0 - 模拟文件 uploader

java - 资源访问异常 : I/O error on POST request

php - 如何使用 PHP 和 MySQL 显示学生在一百名学生中的排名?

php - MySQL 文本搜索示例

python - 单元测试中的代码可重用性?