使用phpunit和Silex进行异常处理

时间:2012-11-10 14:05:50

标签: php phpunit functional-testing silex

我在Silex中使用路由从数据库中删除对象。如果对象不存在,则应抛出404错误。这在浏览器中工作正常,并相应地收到响应。

这是我的来源:

$app->delete("/{entity}/{id}", function(\Silex\Application $app, HttpFoundation\Request $request, $entity, $id) {
    // some prep code is here
    $deleteObject = $this->em->getRepository($entityClass)->find($id);
    if (empty($deleteObject))
        $app->abort(404, "$ucEntity with ID $id not found");
    // other code comes here...
}

这是我的测试用例:

// deleting the same object again should not work
$client->request("DELETE", "/ccrud/channel/$id");
$this->assertTrue($response->getStatusCode() == 404);

现在phpunit失败并出现以下错误:     1)CrudEntityTest :: testDelete     Symfony \ Component \ HttpKernel \ Exception \ HttpException:找不到ID为93的频道

我可以从消息中看到404被抛出,但我无法按计划测试响应对象。我知道理论上我可以断言异常本身,但这不是我想要做的,我想得到响应(作为浏览器也会这样做)并测试状态代码本身。

有人想知道如何达到这个目标或者是否有更好的方法来测试它?

谢谢, 丹尼尔

1 个答案:

答案 0 :(得分:2)

这是在Silex本身(see here)的测试中完成的:

public function testErrorHandlerNotFoundNoDebug()
{
    $app = new Application();
    $app['debug'] = false;

    $request = Request::create('/foo');
    $response = $app->handle($request);
    $this->assertContains('<title>Sorry, the page you are looking for could not be found.</title>', $response->getContent());
    $this->assertEquals(404, $response->getStatusCode());
}