2011-10-18 61 views
3

我試圖測試抽象類中的私有方法。測試抽象類中的私有方法擴展了另一個

我有三個抽象類:

abstract class AbstractClass1 extends AbstractClass2 
{ 
    private function _privateFunction() 
    { 
     //method's body 
    } 
} 

abstract class AbstractClass2 extends AbstractClass3 
{ 
    public function __construct($param) 
    { 
     parent::__construct($param) 
    } 
} 

abstract class AbstractClass3 
{ 
    public function __construct($param = array()) 
    { 
     //something 
    } 
} 

測試類:

class AbstractClass1Test extends PHPUnit_Framework_TestCase 
{ 
    public function test_privateFunction() 
    { 
     $stub = $this->getMockForAbstractClass("AbstractClass1"); 
     $class = new ReflectionClass($stub); 
     $method = $class->getMethod("_privateFunction"); 
     $method->setAccessible(true); 

     //some assertings with $method->invoke($stub) 
    } 
} 

測試失敗,因爲錯誤的,:

Missing argument 1 for AbstractClass2::__construct(), called in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php on line 190 and defined

AbstractClass2.php

public function __construct($param) 

AbstractClass1.php

$classMock = $this->getMockForAbstractClass("AbstractClass1"); 

Generator.php:190

if ($callOriginalConstructor && 
    !interface_exists($originalClassName, $callAutoload)) { 
    if (count($arguments) == 0) { 
     <strong>$mockObject = new $mock['mockClassName'];</strong> 
    } else { 
     $mockClass = new ReflectionClass($mock['mockClassName']); 
     $mockObject = $mockClass->newInstanceArgs($arguments); 
    } 
} else ... 

什麼我錯了嗎?或者我該如何在這種情況下測試我的私人功能?

+0

你在哪裏傳遞參數給構造函數? –

+1

[PhpUnit私有方法測試]的可能重複(http://stackoverflow.com/questions/5937845/phpunit-private-method-testing) – Gordon

+1

[塞巴斯蒂安伯格曼的博客:測試你的私人](http:// sebastian-bergmann。 de/archives/881-Testing-Your-Privates.html) – Gordon

回答

6

您需要將參數傳遞給AbstractClass1的構造函數。將數組中的構造函數參數作爲getMockForAbstractClass()的第二個參數傳遞。

$stub = $this->getMockForAbstractClass("AbstractClass1", array('param')); 
0

看到你推翻了原來的構造,

public function __construct($param = array()) //Allow null $param as it would default to array(); 

有了一個新問題:

public function __construct($param) //Does not allow null $param. 

您需要定義$param當你初始化對象。這可能是你的問題。

PHP中的對象不像JavaScript,它們不能像關聯數組那樣被調用。你的對象初始化應該是這樣的:

$mockObject = new ClassExtendingAbstractClass1Or2('parameter'); 

new關鍵字不能在一個變量前使用。

相關問題