2016-09-08 15 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)); 
} 

希望這有助於

相關問題