2016-11-10 19 views
3

我正在編寫單元測試來驗證兩個庫的功能是一樣的。基本上,測試一個接口。PHPUnit Assert兩種可能的結果之一

但是,在一些與錯誤處理相關的測試中。錯誤級別不同,它必須不同,因爲例如,一個生成E_WARNING,另一個只能生成E_USER_WARNING。

所以問題是。 PHP單元中是否存在斷言,可以說錯誤必須是兩種可能結果之一?喜歡的東西:

assertIsIn(array(E_WARNING, E_USER_WARNING), $generatedError); 

我知道我大概可以解決它通過assertContains在交換預期和實際的答案()或可能是一些預斷言結果的操縱。但是,有沒有更清潔的方法?

回答

3

也許你可以用assertContains方法實現(聲稱乾草堆包含針)。如例:

public function testAssertIsIn() 
{ 
    $errorLevel = array(E_WARNING, E_USER_WARNING); 

    $generatedError = E_WARNING; 
    $this->assertContains($generatedError, $errorLevel); 

    $generatedError = E_USER_WARNING; 
    $this->assertContains($generatedError, $errorLevel); 
} 

希望這有助於

+0

很好的回答,我hand't發現那assetContains語法是needle/haystack,而不是參數中的預期/實際。 –

1
$this->logicalOr($this->identicalTo(E_WARNING), $this->identicalTo(E_USER_WARNING)); 

如果你想更乾淨的代碼,你可以把它變成一個自定義的斷言:

public static function assertOneOf(array $expected, $actual, $message = '') { 
    $constraints = []; 
    foreach ($expected as $expectedValue) { 
     $constrains[] = new PHPUnit_Framework_Constraint_IsIdentical($expectedValue); 
    } 
    $constraint = new PHPUnit_Framework_Constraint_Or; 
    $constraint->setConstraints($constraints); 
    self::assertThat($actual, $constraints, $message); 
}