2016-02-10 98 views
1

我正在測試一個名爲Method的方法的抽象類。使用名爲'方法'的方法的PHPUnit測試和抽象類

這裏是我的抽象類(有刪節):

abstract class ClassToTest { 

    function Method($_value = NULL) { 
    // based on the value passed in a different value is returned. 
    } 
} 

這裏是我的PHPUnit類:

class ClassToTestTest extends PHPUnit_Framework_TestCase { 
    public $object = NULL; 

    public function setUp() { 
    $this->object = $this->getMockForAbstractClass('ClassToTest'); 
    } 

    public function testMethod() { 

    // passing no value should return NULL 
    $this->assertNull($this->object->Method()); 

    // passing a value should return a value 
    $this->assertEquals($this->object->Method($method), 'return_value'); 
    } 
} 

基於PHPUnit Documentation我應該能夠使用

$stub->expects($this->any())->method('Method')->willReturn('foo'); 

不知何故,但我無法弄清楚如何使這項工作。

如何使用PHPUnit測試名爲Method的方法?

此外,我沒有選擇將方法重命名爲其他內容。

回答

2

您正在測試的課程肯定是您不應該嘲笑的唯一課程。如果你僞造它的方法調用,你不會真的測試它。

由於你的類是抽象的,你需要通過一個具體的實現來測試它。如果您沒有,請爲測試創建它。

class MyClassToTest extends ClassToTest 
{ 
    // implement abstract methods 
} 
class ClassToTestTest extends PHPUnit_Framework_TestCase 
{ 
    private $object; 

    protected function setUp() 
    { 
     $this->object = new MyClassToTest(); 
    } 

    public function testMethod() 
    { 
     $this->assertSame('return_value', $this->object->Method('foo')); 
    } 

}

+0

有一組從該抽象類繼承的類,這樣我就可以以這種方式測試,但該方法的聲明和抽象類定義,因此它使最有意義的是抽象類測試應該測試該方法而不依賴於繼承類來測試它。 –

+0

使用其中一個實現來測試抽象的。你可以有一個通用的測試用例類,所有的實現測試都會繼承它們(因爲它們都會共享這種行爲)。無論哪種方式,嘲笑受測試的課程都不是這樣。 –