2014-01-17 91 views
8

對於下面的代碼,的PHPUnit:斷言參數時將它傳遞給模擬對象

$mockObject->expects($this->at(0)) 
      ->method('search') 
      ->with($searchConfig) 
      ->will($this->returnValue([])); 

這條線將自動做出assertensure,當它調用方法search它必須包含$searchConfig參數。在這種情況下,我們必須提供完全匹配的$searchConfig,但有時它很難,如果它是一個數組或對象。

是否有任何可能的方法讓PHPUnit調用某種特定的方法來聲明它包含參數傳入方法,因爲我們想要?

例如,我可以創建閉合功能以如下斷言,而不是使用->with()方法

function ($config){ 
    $this->assertFalse(isset($config['shouldnothere'])); 
    $this->assertTrue($config['object']->isValidValue()); 
} 

回答

18

可以使用->with($this->callback())並傳入封閉對參數執行更復雜的斷言。

PHPUnit Docs

回調()約束可以用於更復雜的參數 驗證。該約束將PHP回調作爲其唯一的參數 。 PHP回調函數將接收參數驗證爲 其唯一參數,並且如果參數通過驗證 ,則返回TRUE,否則返回FALSE。

實施例10.13:更復雜的參數驗證

getMock( '觀察',陣列( 'reportError'));

$observer->expects($this->once()) 
      ->method('reportError') 
      ->with($this->greaterThan(0), 
        $this->stringContains('Something'), 
        $this->callback(function($subject){ 
         return is_callable(array($subject, 'getName')) && 
          $subject->getName() == 'My subject'; 
        })); 

    $subject = new Subject('My subject'); 
    $subject->attach($observer); 

    // The doSomethingBad() method should report an error to the observer 
    // via the reportError() method 
    $subject->doSomethingBad(); 
} } ?> 

所以你的測試會變成:

$mockObject->expects($this->at(0)) 
->method('search') 
->with($this->callback(
    function ($config){ 
     if(!isset($config['shouldnothere']) && $config['object']->isValidValue()) { 
      return true; 
     } 
     return false; 
    }) 
->will($this->returnValue([])); 
+1

我總是忘了驗證多個參數時使用'回報TRUE'。 – Michiel