具有显式连接的 CakePHP 单元测试控制器
CakePHP unit-testing controllers with explicit joins
我要测试的控制器代码包括查询如
的函数
$this->Model->find('all', [
'joins' => [
'table' => database.table,
'type' => 'inner',
'conditions' => ['table.id' => 'Model.table_id']
],
]);
被广泛使用。
问题是 testAction
在 test
数据源中正确找到模型的 table,但没有修改显式连接,将其连接到实际 database.table
,而不是 test.table
.
我的直觉告诉我,重写这些查询以使用 CakePHP 的包含而不是连接应该允许 CakePHP 的 ControllerTestCase
将连接模型的数据源替换为 test
数据源,从而解决问题。但是,我不想重写所有查询代码。
有谁知道解决这个问题的方法吗?如果不是,我认为 contain 方法可以解决问题是否正确?
问题是在连接中,'table' => database.table,
是硬编码的,所以 cake 无法将查询重定向到 test
数据源(它会在 database
).要解决此问题,请将 database.test
中的 database
替换为 $this->Model->getDataSource()->config['database']
,其中 Model
指的是 table
表示的模型(或者是连接 table ).在测试用例中,Cake 可以将模型的数据源更改为 test
数据源,因此查询将被适当修改。
我要测试的控制器代码包括查询如
的函数$this->Model->find('all', [
'joins' => [
'table' => database.table,
'type' => 'inner',
'conditions' => ['table.id' => 'Model.table_id']
],
]);
被广泛使用。
问题是 testAction
在 test
数据源中正确找到模型的 table,但没有修改显式连接,将其连接到实际 database.table
,而不是 test.table
.
我的直觉告诉我,重写这些查询以使用 CakePHP 的包含而不是连接应该允许 CakePHP 的 ControllerTestCase
将连接模型的数据源替换为 test
数据源,从而解决问题。但是,我不想重写所有查询代码。
有谁知道解决这个问题的方法吗?如果不是,我认为 contain 方法可以解决问题是否正确?
问题是在连接中,'table' => database.table,
是硬编码的,所以 cake 无法将查询重定向到 test
数据源(它会在 database
).要解决此问题,请将 database.test
中的 database
替换为 $this->Model->getDataSource()->config['database']
,其中 Model
指的是 table
表示的模型(或者是连接 table ).在测试用例中,Cake 可以将模型的数据源更改为 test
数据源,因此查询将被适当修改。