2014-03-27 100 views
0

另一個類中使用的PHPUnit模擬方法? 例子:另一個類中使用的PHPUnit模擬方法

class Main { 
    function makePayment() { 
    $pp = new PayPalSOAPSomeClass(); 
    return $pp->doExpressCheckout(); 
    } 
} 

在測試我想測試我的主類和模擬doExpressCheckout()方法,我不工作的代碼進行測試:

public function testStub() { 
     $stub = $this->getMock('PayPalSOAPSomeClass'); 
     $stub->expects($this->any()) 
      ->method('doExpressCheckout') 
      ->will($this->returnValue(false)); 
     $pp = new Main; 
     $this->assertEquals(true, $pp->doExpressCheckout()); 
    } 

回答

2

你必須測試的主類的問題。第一個問題是它在內部創建一個對象。你需要修改這個類來使用依賴注入。你的makePayment()應該接受一個PayPalSOAPSomeClass對象。

function makePayment(PayPalSOAPSomeClass $pp) 
{ 
    return $pp->doExpressCheckout(); 
} 

在主類中,你可以修改它使用構造函數依賴注入,或一個setter依賴注入,這是比makePayment更好。然後,你引用內部對象。

例如:

class Main { 
    private $svc; 

    // Constructor Injection, pass the PayPalSOAPSomeClass object here 
    public function __construct($Service = NULL) 
    { 
     if(! is_null($Service)) 
     { 
      if($Service instanceof PayPalSOAPSomeClass) 
      { 
       $this->SetPayPalSOAP($Service); 
      } 
     } 
    } 

    function SetPayPalSOAP(PayPalSOAPSomeClass $Service) 
    { 
     $this->svc = $Service; 
    } 

    function makePayment() { 
     $pp = $this->svc; 
     return $pp->doExpressCheckout(); 
    } 
} 

測試:

public function testStub()  
{ 
    $stub = $this->getMock('PayPalSOAPSomeClass'); 
    $stub->expects($this->any()) 
     ->method('doExpressCheckout') 
     ->will($this->returnValue(false)); 
    $pp = new Main($stub); 
    $this->assertEquals(true, $pp->doExpressCheckout()); 
} 
+0

如果我不喜歡你說,爲什麼我需要嘲弄?我可以寫成$ this-> assertEquals(true,false);因爲在模擬我設置虛假的返回值 – Actimele

+0

DI後,注入類具有公共屬性,我可以如何設置此屬性? – Actimele

+0

是的,你可以,而且工作範圍非常有限。之後,您將希望更徹底地測試此代碼並獲得更復雜的返回結果,例如響應,錯誤等...... Mocking允許您的代碼仍然調用正確的內部函數,以確保代碼在返回的數據上相應地運行。你可以得到參考號碼,並確保它們是正確的。帳戶餘額,處理錯誤等...所有這些都可能由模擬程序返回,您的庫代碼會測試它以確保您的模塊正確處理所有響應。 –

相關問題