2016-09-08 14 views
2

我有一个类的形式是这样的:如何测试一个类的构造函数带有一些参数的方法?

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的,它抛出像一些错误:

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())进行测试,因为它似乎违背了单元测试的全部目的。

+0

PHPUnit的 – Eli

+0

的设置方法试试吧“即使我提供了参数,也会引发错误。“它不应该。在PHPunit类中创建对象应该与在其他地方创建对象没有区别。你的问题听起来像是对象的构造函数本身,而不是PHPunit。 –

+0

@WillemRenzema,我也有同感。但无法解决它。 – sunil

回答

4

单元测试的基本思想是测试一个类/方法本身,而不是这个类的依赖。为了单元测试你的类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)); 
    } 
} 

注意:如果你不会使用模拟的在这里,但一个真正的CLASSB和classC情况下,它不会是单元测试了 - 这将是一个功能测试

1

您可以通过方法setMethods告诉PHPUnit您想要模拟指定类的方法。 From the doc

setMethods(array $methods)可以称为素生成器对象 上指定是方法具有可配置 测试双代替。其他方法的行为不会改变。如果您 请致电setMethods(null),则不会替换任何方法。

所以,你可以构造你的类不更换任何方法,但绕过结构如下(工作)代码:

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

    $this->assertEquals(3, $a->getSum(1,2)); 
} 

希望这有助于

相关问题