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



我正在使用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"

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

最新更新