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

时间:2012-09-13 14:06:09

标签: symfony doctrine-orm phpunit symfony-2.1

我正在使用抓取工具测试控制器,但是当我发布一个不会产生任何错误的表单时,它会将表单保存在数据库中。

如何在不更换控制器且不测试其他内容的情况下阻止他这样做。

这种测试有最好的做法吗? 我尝试了回滚,但在ControllerTest中没有更多的活动事务

2 个答案:

答案 0 :(得分:4)

您需要编写自己的测试客户端类,扩展Symfony \ Bundle \ FrameworkBundle \ Client。 这是因为默认客户端不会在请求之间共享连接对象(因此您无法在测试客户端之外使用事务)。如果您扩展测试客户端,您可以自己处理事务。

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

这里描述得很好:

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

当你有自己的doRequest方法时,你只需要处理事务,所以你用handle和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
}

答案 1 :(得分:0)

您可以阅读PHPUnit的文档以进行数据库测试

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

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

如果您认为上述内容太复杂,您可能有兴趣制作数据库层的模型

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

Mockup是在原始对象中创建一个自定义对象,放置自己的测试控件。在这种情况下,您可能对模型实体经理

感兴趣