使用phpunit测试多个异常

时间:2010-11-30 13:14:43

标签: unit-testing exception phpunit

我是单元测试的新手,并编写了以下测试:

/**
 * @expectedException Exception
 */
public function testCantGetInvalidCampsite() {
    $invalidIds = array(300000, "string");
    foreach($invalidIds as $id) {
        $this->campsites->getCampsite($id); // will throw an exception
    }
}

我不确定这是否实际测试了所有无效的ID,或者只是在它遇到第一个异常时就停止了。这是我应该如何测试多个异常,还是我需要将其拆分为多个不同的测试,还是我应该采用另一种方式?

此外,如果我的异常消息是动态生成的,例如“无法检索ID为30000的记录”,我该如何测试是否正在生成正确的动态消息?

2 个答案:

答案 0 :(得分:10)

我在这种情况下使用的方法是使用phpunit dataProviders

class MyTest extends PHPUnit_Framework_TestCase
{
    public function invalidIds()
    {
       return array(
           array(300000),
           array("string")
       );
    }


    /**
     * @dataProvider invalidIds
     * @expectedException Exception
     */
    public function testCantGetInvalidCampsite($invalidId)
    {
        $this->campsites->getCampsite($invalidId); // will throw an exception
    }
}

答案 1 :(得分:1)

如果预期的异常数与遇到的异常数不匹配,您可以尝试捕获异常,计算它们并使测试失败。

如果您遇到异常消息,也可以获取异常消息,并检查它是否正确。

在代码中:

public function testCantGetInvalidCampsite() {
    $invalidIds = array(300000, "string");
    $exceptionCount = 0;

    foreach($invalidIds as $id) {

        try {
            $this->campsites->getCampsite($id); // will throw an exception
        } catch (Exception $e)
            $exceptionCount ++;
            $this->assertEquals('my exception message', $e->getMessage());
        }
    }

    // assert here that exception count is two
    $this->assertEquals(2, $exceptionCount);
}

更清洁的方式,我认为这样做会添加两个TestCases ......

testCantGetInvalidCampSite_String()
testCantGetInvalidCampSite_InvalidId()

因此,如果测试失败,您会立即看到失败的内容。