我正在使用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);
}
一切都按预期工作。
每次运行上述操作的测试时,它都会在数据库中创建一个新的插座。这是理想的吗?或者我不应该在测试中将数据持久化到数据库中吗?
答案 0 :(得分:1)
有很多方法可以处理涉及数据库持久性的测试。有时您希望通过填充数据来功能性地测试表单,然后提交表单,然后检查状态代码并最终验证内容。有时您需要预先加载一组灯具。
首先,您需要使用测试数据库在测试环境中隔离测试。
在app / config_test.yml中:
...
doctrine:
dbal:
dbname: %database_name%_test
然后使用--env=test
选项创建数据库和模式。
保持数据库清洁的最简单方法是在每次测试之前清除测试数据库。
在你的测试中:
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
...
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"
。
当然还有很多其他解决方案。