我是单元测试的新手,并编写了以下测试:
/**
* @expectedException Exception
*/
public function testCantGetInvalidCampsite() {
$invalidIds = array(300000, "string");
foreach($invalidIds as $id) {
$this->campsites->getCampsite($id); // will throw an exception
}
}
我不确定这是否实际测试了所有无效的ID,或者只是在它遇到第一个异常时就停止了。这是我应该如何测试多个异常,还是我需要将其拆分为多个不同的测试,还是我应该采用另一种方式?
此外,如果我的异常消息是动态生成的,例如“无法检索ID为30000的记录”,我该如何测试是否正在生成正确的动态消息?
答案 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()
因此,如果测试失败,您会立即看到失败的内容。