簡體   English   中英

如何在PHPUnit中使用數據提供程序測試異常?

[英]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不提供此組合。 但這可以通過一個簡單的技巧來實現:

  1. 基本解決方案

用於正常和異常測試的單獨測試方法。

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'],
        ];
    }
}
  1. 擴展解決方案

一個。 一種測試方法並使用Reflection API。

我們只有一種測試方法。 數據提供程序方法返回一個數組, $expected測試方法輸入的元素可以是Exceptions 如果$expectedException我們使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM