这是测试将数据插入表的代码的理想方法吗?

时间:2014-10-17 10:55:56

标签: rest symfony post tdd

我正在使用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);
}

一切都按预期工作。

每次运行上述操作的测试时,它都会在数据库中创建一个新的插座。这是理想的吗?或者我不应该在测试中将数据持久化到数据库中吗?

1 个答案:

答案 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"

当然还有很多其他解决方案。