在symfony2中使用phpUnit进行测试时,如何回滚任何事务



我正在使用爬网程序测试控制器,但当我发布一个没有生成任何错误的表单时,它会将表单保存在数据库中。

我怎么能在不更换控制器和不测试其他东西的情况下阻止他这样做呢。

这类测试有最佳实践吗?我尝试了回滚,但在ControllerTest中没有更多的活动事务

您需要编写自己的测试客户端类来扩展Symfony\Bundle\FrameworkBundle\client。这是因为默认客户端不在请求之间共享连接对象(所以您不能在测试客户端之外使用事务)。若您扩展了测试客户端,您就可以自己处理事务。

在客户端类中,您需要创建静态连接对象,并重写方法doRequest()以避免每次都创建新的连接对象,而是使用我们的静态连接对象。

这里描述得很好:

http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

当您有自己的doRequest方法时,您只需要处理事务,所以您可以用begin和rollback包装handle()方法。你的doRequest方法可能看起来像这样:

protected function doRequest($request)
{
    // here you need create your static connection object if it's doesn't exist yet
    // and put it into service container as 'doctrine.dbal.default_connection'
    (...)
    self::$connection->beginTransaction();
    $response = $this->kernel->handle($request);
    self::$connection->rollback();
    (...)
    return $response
}

您可以阅读PHPUnit用于数据库测试的文档

http://www.phpunit.de/manual/3.6/en/database.html

您将需要设置您的数据库并删除您所做的更改。

如果你认为上面太复杂了,也许你有兴趣制作一个数据库层的模型

http://www.phpunit.de/manual/3.6/en/test-doubles.html

Mockup是在放置自己的测试控件的原始对象的基础上创建一个自定义对象。在这种情况下,您可能对条令的实体管理器模型感兴趣

最新更新