我正在使用爬虫测试控制器,但是当我发布一个不会产生任何错误的表单时,它会将表单保存在数据库中。
我怎样才能在不更改控制器且不测试其他东西的情况下阻止他这样做。
这种测试有最佳实践吗?我尝试了回滚,但在 ControllerTest 中没有更多活动事务
我正在使用爬虫测试控制器,但是当我发布一个不会产生任何错误的表单时,它会将表单保存在数据库中。
我怎样才能在不更改控制器且不测试其他东西的情况下阻止他这样做。
这种测试有最佳实践吗?我尝试了回滚,但在 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 是在放置您自己的测试控件的原始对象的基础上创建一个自定义对象。可能在这种情况下,您对模拟 Doctrine 的实体管理器感兴趣