[英]How to test exceptions using a data provider in PHPUnit?
PHPUnit有一個非常有用的功能@dataProvider
,它允許測試方法的多個案例。 它還有另一個很酷的注釋 - @expectedException
以確保應用程序在定義的位置拋出正確的Exception
。
我正在測試針對多個邊緣情況的方法,並希望將這兩個功能組合在一起(不是工作代碼):
class TestMyClass
{
/**
* @dataProvider provideDataForFoo
*/
public function testFoo($paramBar, $paramBuz, $expected)
{
$myObject = new MyClass();
$this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz));
}
public function provideDataForFoo()
{
return [
['expected lorem', 'bar lorem', 'buz lorem'],
['expected ipsum', 'bar ipsum', 'buz ipsum'],
['expected exception', 'bar invalid argument', 'buz invalid argument'],
];
}
}
可能/如何使用@expectedException
作為其中一種情況,使用@dataProvider
?
PHPUnit不提供此組合。 但這可以通過一個簡單的技巧來實現:
用於正常和異常測試的單獨測試方法。
class TestMyClass
{
/**
* @dataProvider provideDataForFoo
*/
public function testFoo($paramBar, $paramBuz, $expected)
{
$myObject = new MyClass();
$this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz));
}
public function provideDataForFoo()
{
return [
['expected lorem', 'bar lorem', 'buz lorem'],
['expected ipsum', 'bar ipsum', 'buz ipsum'],
];
}
/**
* @dataProvider provideDataForFooException
*/
public function testFooException($paramBar, $paramBuz, $expectedException)
{
$myObject = new MyClass();
$this->expectException($expectedException);
$myObject->foo($paramBar, $paramBuz);
}
public function provideDataForFooException()
{
return [
['expected exception', 'bar invalid argument', '\My\Exception\Fully\Qualified\Name'],
];
}
}
一個。 一種測試方法並使用Reflection API。
我們只有一種測試方法。 數據提供程序方法返回一個數組, $expected
測試方法輸入的元素可以是Exceptions
。 如果$expected
是Exception
我們使用expectException(...)
處理這種情況,否則作為“正常”測試用例。
灣 一種測試方法並使用“異常”標志。
理論上,一個方法可以return
一個Exception
。 要考慮這種情況,我們必須引入一個類似“testItForException”的標志,並將此信息提供給測試方法。 它也可以是數據提供者方法返回的數組中的另一個元素,例如exception
(然后在測試方法中: if(! (empty($exception)) { test it as normal } else {expect exception})
)。
您也可以使用帶參數的$this->setExpectedExceptionRegExp()
代替注釋
$exceptionName — mixed (class name or exception instance)
$exceptionMessageRegExp — string (optional regular expression)
$exceptionCode — integer (optional exception code)
注意:舊的setExpectedException()
方法已在PHPUnit 5.2中棄用
這意味着,您可以通過數據提供程序傳遞異常類名稱。 如果它不為空,則調用setExpectedExceptionRegExp()
在注釋的方法的另一個好處是,你可以具體談談其中的異常是預期的,如果你不調用該方法在測試的開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.