В настоящее время я пытаюсь выполнить модульное тестирование некоторого кода. Я выполняю некоторые операторы 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».
Там вы можете прочитать, что CakePHP автоматически применяет псевдоним соединения default
к test
при выполнении модульных тестов. Чтобы получить такое поведение, вы должны сами определить этот псевдоним в своем phpunit bootstrap.php следующим образом:
\Cake\Datasource\ConnectionManager::alias('test', 'default');
Вы можете прочитать об этом здесь ConnectionManager::alias забавно то, что в документации для alias
прямо указано
Например, если вы используете псевдоним «по умолчанию» для «теста», выборка «по умолчанию» всегда будет возвращать «тестовое» соединение, пока псевдоним определен.
test
используется, когда вы используетеClassRegistry::init
для создания экземпляра модели. Когда вы используете ручное соединение, как вы используете, вам нужно вручную получить соединениеtest
. Стоит отметить, что в CakePHP 3.0 соединениеdefault
будет привязано к тестовым настройкам, чтобы предотвратить такого рода проблемы. - person jeremyharris   schedule 20.04.2015default => test
. - person ndm   schedule 20.04.2015default
получает псевдонимtest
, мой код выше должен работать, верно? Или мне нужно получить имя соединения по-другому? - person AlexWerz   schedule 21.04.2015\Cake\Datasource\ConnectionManager::alias('test', 'default');
в своем тестовом бутстрапе. Документация по тестированию в CakePHP говорит мне, что это делается для меня самим CakePHP, но это кажется неверным: Книга CakePHP — Тестирование Они гласят:For example if you use the ‘default’ connection, instead you will get the test connection in test cases.
- person AlexWerz   schedule 21.04.2015FixtureManager::_aliasConnections()
. Вы должны отладить, почему набор тестов, похоже, не доходит до него. - person ndm   schedule 21.04.2015