我目前正在尝试对一些代码进行单元测试。我正在执行一些手动输入的SQL语句,如下所示:

$db = ConnectionManager::get('default');
...
$stmt = $db->prepare($sql);
$stmt->execute();


我以为只要运行单元测试并请求default连接,我都会获得test连接。如果未在我的配置中定义它,将抛出异常。
当我运行针对数据库执行语句的测试时,总是针对default连接执行测试。永远不会使用test连接。

知道我在做什么错吗?

我的数据库配置如下:

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'dbname',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'quoteIdentifiers' => false,
    ],

    /**
     * The test connection is used during the test suite.
     */
    'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'dbname_test',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'quoteIdentifiers' => false,
    ],
]


谢谢你的帮助!

编辑
我认为文档是错误的:


  默认情况下,CakePHP将为应用程序中的每个连接添加别名。应用程序的引导程序中定义的每个不以test_开头的连接都将创建一个带有test_前缀的别名。别名连接可以确保您不会在测试用例中意外使用错误的连接。连接别名对应用程序的其余部分是透明的。例如,如果您使用“默认”连接,则可以在测试用例中获得测试连接。如果您使用“副本”连接,则测试套件将尝试使用“ test_replica”。


Link

您可以在此处看到CakePHP在运行单元测试时自动将default连接别名为test。要获得该行为,您必须在phpunit bootstrap.php中自己定义该别名,如下所示:

\Cake\Datasource\ConnectionManager::alias('test', 'default');


您可以在此处ConnectionManager::alias进行阅读。有趣的是,alias的文档中明确指出


  例如,如果您将“默认”别名设置为“测试”,则只要定义了别名,获取“默认”将始终返回“测试”连接。

最佳答案

默认情况下,当您在我们的phpunit.xml配置中加载灯具管理器监听器时,连接别名默认完成,因为它分布在应用程序模板中:

https://github.com/cakephp/app/blob/master/phpunit.xml.dist#L23-L31

关于mysql - 测试时的CakePHP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29748911/

10-11 23:59
查看更多