我目前正在嘗試單元測試我的一些代碼。我執行一些手動輸入的SQL語句是這樣的:CakePHP連接測試
$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_前綴別名。別名連接確保您在測試用例中不會意外地使用錯誤的連接。連接別名對於其他應用程序是透明的。例如,如果您使用「默認」連接,則會在測試用例中獲得測試連接。如果您使用'replica'連接,測試套件將嘗試使用'test_replica'。
您可以閱讀那裏,CakePHP的運行單元測試時自動走樣default
連接test
。要獲得這種行爲,你必須定義自己的別名在您的PHPUnit的bootstrap.php中,像這樣:
\Cake\Datasource\ConnectionManager::alias('test', 'default');
您可以瞭解的是,這裏ConnectionManager::alias有趣的是,alias
文件明確規定
例如,如果您將'default'別名爲'test',則只要定義了別名,獲取'default'將始終返回'test'連接。
當您使用'ClassRegistry :: init'來實例化模型時,會使用'test'配置。當你使用你正在使用的手動連接時,你需要手動獲得'test'連接。值得注意的是,在CakePHP 3.0中,'default'連接將被設置爲測試設置的別名以防止這種問題。 – jeremyharris
你通常所期望的是默認行爲。確保您使用的是正確的PHPUnit配置,並且它包含CakePHP Fixture Injector的偵聽器,因爲這是配置'default => test'別名的地方。 – ndm
@jeremyharris這個問題關於CakePHP 3.x,它的工作方式不同。 – ndm