ฉันกำลังพยายามทดสอบโค้ดบางส่วนของฉัน ฉันกำลังดำเนินการคำสั่ง 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_ การเชื่อมต่อนามแฝงช่วยให้แน่ใจว่าคุณไม่ได้ใช้การเชื่อมต่อที่ไม่ถูกต้องในกรณีทดสอบ นามแฝงการเชื่อมต่อมีความโปร่งใสกับส่วนที่เหลือของแอปพลิเคชันของคุณ ตัวอย่างเช่น หากคุณใช้การเชื่อมต่อ 'เริ่มต้น' คุณจะได้รับการเชื่อมต่อทดสอบในกรณีทดสอบแทน หากคุณใช้การเชื่อมต่อ 'replica' ชุดทดสอบจะพยายามใช้ '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');
ใน test-bootstrap ของคุณ เอกสารการทดสอบใน CakePHP บอกฉันว่า CakePHP ทำเพื่อฉันเอง แต่ดูเหมือนว่าจะเป็นเท็จ: CakePHP Book - การทดสอบ ระบุว่า: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