我为控制器编写了一个测试,该控制器在数据库中保存了表单传递的一些数据。
我编写了以下测试方法,以确保如果表单为空,则抛出异常:
public function testRegisterNewMerchantExceptionNoDataSubmitted()
{
$client = static::createClient();
$crawler = $client->request('GET', '/getstarted');
$form = $crawler->selectButton('getStarted[submit]')->form();
$form['getStarted[email]'] = '';
$this->setExpectedException('DomainException');
$client->submit($form);
$this->assertEquals(500, $client->getResponse()->getStatusCode());
//dump($client->getResponse());die;
}
我正在测试的方法如下:
public function endAction(Request $request)
{
$form = $this->createForm(new GetStartedType());
$form->handleRequest($request);
if ($form->isValid()) {
// Get data from form
$data = $form->getData();
} else {
throw new \DomainException('No data submitted.');
}
...
我确信在测试期间也会抛出异常,因为转储Response对象页面是500错误,报告确切消息“No data submitted”。更多,对状态代码的assertEquals测试是成功的,因此毫无疑问是否正确抛出异常。
但是$this->setExpectedException()
测试不会拦截它并返回测试失败。
知道为什么会这样吗?
答案 0 :(得分:3)
使用$this->setExcpectedException()
告诉PHPUnit期望从测试方法中抛出给定的异常类型,而不仅仅是在执行期间的某个时刻抛出了该类型的异常。
当您在控制器方法中抛出异常时,Symfony控制器会捕获
该异常并创建500响应。这意味着不会从测试方法抛出异常,因此测试失败。否则,您的测试看起来很合理,因此删除$this->setExpectedException()
可以解决问题并测试您想要的行为。