我正在使用Symfony2实现REST API。我正在尝试遵循测试驱动开发(TDD)方法。我对Symfony2和TDD都很陌生。
我写了这个测试:
public function testPost()
{
// i) Make a request
$client = static::createClient();
$request = $client->request(
'POST',
'/api/outlets',
array(),
array(),
array('CONTENT_TYPE' => 'application/json'),
'{"name":"Test Outlet"}'
);
// ii) Test the response
$this->assertJsonResponse($client->getResponse(), 201, false);
}
哪个测试控制器的动作:
public function postAction(Request $request)
{
$entity = new Outlet();
$form = $this->createForm(new OutletType(), $entity, array("method" => $request->getMethod()));
$this->removeExtraFields($request, $form);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $entity;
}
return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
}
一切如预期。
每次运行上述操作的测试时,都会在数据库中创建一个新的出口。这理想吗?或者我不应该在测试中将数据持久化到数据库中?
有很多方法可以处理涉及数据库持久性的测试。有时,您希望通过填写数据对表单进行功能测试,然后提交表单,然后检查状态代码,最后验证内容。有时您需要预先加载一组固定装置。
首先,您需要使用测试数据库在测试环境中隔离测试。
应用程序内/config_test.yml:
...
doctrine:
dbal:
dbname: %database_name%_test
然后使用--env=test
选项创建数据库和模式。
保持数据库清洁的最简单方法是在每次测试之前清除测试数据库。
在您的测试中:
use DoctrineCommonDataFixturesPurgerORMPurger;
...
protected function setUp()
{
$this->client = static::createClient(array('environment' => 'test'));
$purger = new ORMPurger($this->client->getContainer()->get('doctrine.orm.entity_manager'));
$purger->setPurgeMode(ORMPurger::PURGE_MODE_DELETE);
$purger->purge();
}
如果在tearDown()
中进行清除,则测试可能会崩溃,并且以下测试将没有干净的数据库。
依赖项中需要"doctrine/data-fixtures"
。
当然还有很多其他的解决方案。