2015-11-06 3 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')); 
    } 
} 
Смежные вопросы