2015-04-20 190 views
0

我目前正在嘗試單元測試我的一些代碼。我執行一些手動輸入的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'。

Link

您可以閱讀那裏,CakePHP的運行單元測試時自動走樣default連接test。要獲得這種行爲,你必須定義自己的別名在您的PHPUnit的bootstrap.php中,像這樣:

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

您可以瞭解的是,這裏ConnectionManager::alias有趣的是,alias文件明確規定

例如,如果您將'default'別名爲'test',則只要定義了別名,獲取'default'將始終返回'test'連接。

+0

當您使用'ClassRegistry :: init'來實例化模型時,會使用'test'配置。當你使用你正在使用的手動連接時,你需要手動獲得'test'連接。值得注意的是,在CakePHP 3.0中,'default'連接將被設置爲測試設置的別名以防止這種問題。 – jeremyharris

+0

你通常所期望的是默認行爲。確保您使用的是正確的PHPUnit配置,並且它包含CakePHP Fixture Injector的偵聽器,因爲這是配置'default => test'別名的地方。 – ndm

+0

@jeremyharris這個問題關於CakePHP 3.x,它的工作方式不同。 – ndm

回答

0

我們也有同樣的錯誤,對於某些表,測試得到默認的數據庫而不是無故測試數據庫。最後,使用setUp函數頂部的代碼(在parent :: setUp()之前)解決了這個問題(我們有一個主測試類,我們從中擴展所有測試,做一些設置,我們把它放在那裏)

TableRegistry::clear();