如何在功能测试中连接测试数据库?

时间:2017-11-21 06:23:14

标签: php symfony phpunit

我在symfony学习功能测试,并且它真的很成功,但我在数据库中遇到了问题。在我的系统中,我有2个数据库,示例数据库和sample_test数据库。示例数据库用于生产,sample_test用于测试功能测试。我在sample_test中有空数据。在我的config_test.yml中。

doctrine:
    # ...
    dbal:
        host:     127.0.1.1
        dbname:   sample_test
        user:     root
        password: null

如果我加载我的夹具。它已成功添加到我的sample_test数据库中。在对我的代码进行功能测试时。如何将其连接到我的sample_test数据库?就像这段代码一样

public function testAddPatient(){

    $values = array(
        'patient' => array(
            'company' => 1,
            'profile' => array(
                'firstName' => 'John',
                'lastName' => 'Funtional test',
                'email' => 'email123@gmail.com',
                'gender' => 1,
                'address' => array(
                    'street' => 'test functional street',
                    'zipCode' => 122,
                    'city' => 367,
                    'state' => 194,
                    'country' => 235
                )
            ),
            'medicalProfile' => array(
                'policyNumber' => 11
            )
        )
    );

    $this->client->request('POST', '/api/v1/patients', $values, array(), array( 'CONTENT_TYPE' => 'application/json'));

    $this->assertEquals(
        Response::HTTP_OK,
        $this->client->getResponse()->getStatusCode()
    );
}

当我添加患者时。它应该添加到我的sample_test数据库中而不是样本数据库中。我是否想念我的数据库或配置设置?这是我现在完成项目的最后一步。

当我运行命令phpunit时,它不会添加到sampte_test数据库

其他信息:

这就是我的设置 我复制app_dev.php并将其转换为app_test.php。我对该文件做了一些更改。我导出示例数据库中的数据和结构,并将其导入sample_test数据库。 注意:我在oath_clients表中编辑redirect_uris,只需将dev替换为test即可。在我的webtestcase控制器中,我有这个代码

public function setUp()
    {
        $this->client = static::createClient(array(),
            array(
                'PHP_AUTH_USER' => self::USERNAME,
                'PHP_AUTH_PW' => self::PASSWORD
            ));

    }

因为用户名和密码现在是我的sample_test数据库。当我运行phpunit。它现在有效。

2 个答案:

答案 0 :(得分:1)

web目录中,您可以找到来自2个环境的访问文件,prod(app.php),dev(app_dev.php) 如果你想要config_test.yml应用,你应该创建第三个env文件app_test.php,它将通过' test'进入AppKernel对象

您也可以在dev env上执行此操作,但是您应该在每个功能测试中添加一些http标头,让symfony知道它的测试和切换数据库(但正如我所说,第一个选项应该完成这项工作)

答案 1 :(得分:0)

它应该按预期方式开箱即用,因为Symfony WebTestCase创建的内核默认加载了env = test。

您可以使用options的{​​{1}}参数或设置环境变量手动覆盖环境。请参阅:https://github.com/symfony/framework-bundle/blob/master/Test/KernelTestCase.php#L82

您应该检查WebTestCase::createClient()来电。还要尝试明确设置env:

createClient()

进一步调查:

  1. 找出控制器内部使用的env。使用调试器或打印出$client = static::createClient(array( 'environment' => 'test', 'debug' => false, ));

  2. 如果您在$this->container->get('kernel')->getEnvironment();:检查您的数据库查询。他们是否在dev

  3. 中明确添加了数据库名称