2015-11-06 49 views
0

我正在嘗試編寫一個函數的單元測試,該函數立即從使用函數的輸入作爲參數的不同類中加載對象。我是新的PHP單元測試,並找不到解決我的特定問題的任何事情。我有一些導致無濟於事的線索是使用注射器,並試圖給我們一個反思。PHP單元測試來自不同類的外部靜態方法調用

的代碼我試圖寫一個單元測試是:

public static function isUseful($item) { 

    $objPromo = MyPromoCodes::Load($item->SavedSku); 

    if (!is_null($objPromo) 
    && ($objPromo->PromoType == MyPromoCodes::Interesting_Promo_Type)) { 
    return true; 
    } 
    return false; 
} 

我在嘲笑這一點的嘗試:

public function testIsUseful() { 

    $injector = $this->getMockBuilder('MyPromoCodes') 
    ->setMethods(array('Load')) 
    ->getMock(); 
    $objPromo = $this->getMock('MyPromoCodes'); 
    $objPromo->PromoType = 'very interesting promo type'; 
    $injector->set($objPromo, 'MyPromoCodes'); 

    $lineItem1 = $this->getDBMock('LineItem'); 


    $this->assertTrue(MyClass::isUseful($lineItem1)); 

} 

然而,這並不工作,因爲沒有固定的方法對於這個對象....

不知道還有什麼嘗試,任何幫助,將不勝感激。

+0

你可以看看反映。 https://secure.php.net/manual/en/book.reflection.php –

回答

0

首先你不能用PHPUnit模擬靜態方法。至少不是使用4.x和5.x.

我建議這樣的DI方法:

class MyClass 
{ 
    private $promoCodesRepository; 

    public function __construct(MyPromoCodesRepository $promoCodesRepository) 
    { 
     $this->promoCodesRepository = $promoCodesRepository; 
    } 

    public function isUseful(MyItem $item) 
    { 
     $objPromo = $this->promoCodesRepository->Load($item->SavedSku); 

     // ... 
    } 
} 

在這裏,你可以很容易地嘲笑Load方法。

不幸的是,「靜態」方法在測試過程中會產生很多問題,所以最好儘可能避免。

0

我做the library,使靜態類嘲諷可能:

class MyClass { 

    public static $myPromoCodes = 'myPromoCodes'; 

    public static function isUseful($item) { 

     $objPromo = self::$MyPromoCodes::Load($item->SavedSku); 

     if (!is_null($objPromo) 
     && ($objPromo->PromoType == MyPromoCodes::Interesting_Promo_Type)) { 
     return true; 
     } 
     return false; 
    } 

} 

class MyClassTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testSomething() 
    { 
     $myClass = Moka::stubClass('MyClass'); 
     $myClass::$myPromoCodes = Moka::stubClass(null, ['::Load' => (object)[ 
      'PromoType' => MyPromoCodes::Interesting_Promo_Type 
     ]]); 
     $this->assertTrue($myClass::isUseful((object)['SavedSku' => 'SKU']); 
     $this->assertEquals([['SKU']], $myClass::$myPromoCodes->moka->report('::Load')); 
    } 
} 
相關問題