2017-07-30 14 views
0

我嘗試測試時無法爲內部方法設定值。這裏我寫了一個樣本班。我爲同一個類創建了模擬對象,但不起作用。php單位的內部方法的設定值

class A 
{ 
    public function OneTest() 
    { 
     if($this->TwoTest()){ 
      return true; 
     } 
    } 

    public function TwoTest() 
    { 
     // return somethings 
    } 
} 

我是新的phpunit測試寫作。如果有一位專家幫助我,那對我有好處。我想測試這種方法。我曾嘗試過:

class ATest extends \PHPUnit_Framework_TestCase 
{ 
    public function testOne() 
    { 
     $helper = new testOne(); 

     // trying to set TwoTest() method value but does not effect. 
     $mock = $this->createMock(A::class); 
     $mock->method("TwoTest") 
      ->willReturn(true); 

     $this->assertTrue($helper->OneTest(); 
    } 
} 

其實我不知道如何使用我的模擬方法結果。我在twoTest方法中的實際實現包含一些與數據庫相關的代碼。我不想在測試時間運行db代碼。

回答

1

你和你的模擬很接近。你想要做的就是部分嘲弄。這是通過創建A的模擬來完成的,其中只有TwoTest被模擬,即它現在總是返回true,並且永遠不會實際調用A中原始實現中的實際代碼,而所有其他方法仍像以前那樣起作用。因此撥打$mock->OneTest()應返回預期結果。由於您在(部分)模擬的實例上進行了兩個呼叫,因此您不需要$helper。所以,你的測試可能會是這個樣子:

public function testOneWhenTwoTestReturnsTrue() 
{ 
    $mock = $this->getMockBuilder(A::class) 
     ->setMethods(["TwoTest"]) 
     ->getMock(); 
    $mock->method("TwoTest") 
     ->willReturn(true); 

    $this->assertTrue($mock->OneTest(); 
} 

請注意,我用getMockBuilder(),而不是隻是createMock()setMethods()是我們需要爲您的測試。我們只覆蓋我們想要模擬的一種方法,其餘的將像原始類中定義的那樣運行。引用文檔:

setMethods(array $ methods)可以在模擬構建器對象上調用,以指定要用可配置測試對象替換的方法。其他方法的行爲不會改變。如果您調用setMethods(null),則不會替換任何方法。