在 CakePhp 中测试时的事务回滚
Transaction rollback while testing in CakePhp
出于某种原因,事务回滚在我的测试用例中不起作用。当我从控制器执行同一段代码时,它会恢复执行良好的 SQL。但是从我的测试用例执行时它不会回滚。
我已经尝试在测试数据库中禁用缓存并更改为我可以在我的服务器中使用的最新可能的 cakephp 版本,即 2.6.13。但它没有用。
有人可以帮助我吗?
示例:
TipoLog.php:
public function insert(){
$data = array(
$this->alias => array(
'id' => 99,
'descricao' => 'Testing 123',
),
);
$this->getDataSource()->begin();
$result = $this->save($data);
$this->getDataSource()->rollback(); // should undo $this->save
return $result;
}
在控制器上执行时,效果很好:
MyController.php
public function teste() {
$this->autoRender = false;
$this->loadModel('ControleFrequencia.TipoLog');
$id = 99;
debug($this->TipoLog->findById($id)); //returns nothing - OK
$this->TipoLog->insert($id);
debug($this->TipoLog->findById($id)); //returns nothing - OK
}
但是当我执行测试用例时,回滚不起作用:
MyTestCaseTest.php
public function testTest() {
$TipoLog = ClassRegistry::init('ControleFrequencia.TipoLog');
$id = 99;
debug($TipoLog->findById($id)); //returns nothing - OK
$TipoLog->insert($id);
debug($TipoLog->findById($id)); //returns the inserted row - NOT OK
}
SQL-测试用例的日志
...
192 BEGIN
193 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
194 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
195 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`descricao` = 'Testing 123' AND `TipoLog`.`id` != 99
196 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
197 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
198 INSERT INTO `my_db_test`.`tipo_log` (`id`, `descricao`) VALUES (99, 'Testing 123')
199 ROLLBACK
200 SELECT `TipoLog`.`id`, `TipoLog`.`descricao` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99 LIMIT 1
database.php
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'myhost',
'login' => 'mylogin',
'password' => 'mypass',
'database' => 'my_db',
'prefix' => '',
);
public $test = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'myhost',
'login' => 'mylogin',
'password' => 'mypass',
'database' => 'my_db_test',
'prefix' => '',
);
这是因为,默认情况下,CakePHP fixtures 使用 MEMORY
不支持事务功能的数据库引擎。
https://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
您可以通过 运行 debug($this->query("SHOW CREATE TABLE tipo_log;"));
在测试中的某处进行检查。
要解决此问题,您需要将灯具 class $canUseMemory
属性设置为 false
。这将使您的灯具使用数据库引擎,您的 table 是用
创建的
喜欢下一个:
class TipoLogFixture extends CakeTestFixture {
public $canUseMemory = false;
public $import = ['model' => 'TipoLog'];
public $records = [
...
];
}
出于某种原因,事务回滚在我的测试用例中不起作用。当我从控制器执行同一段代码时,它会恢复执行良好的 SQL。但是从我的测试用例执行时它不会回滚。
我已经尝试在测试数据库中禁用缓存并更改为我可以在我的服务器中使用的最新可能的 cakephp 版本,即 2.6.13。但它没有用。 有人可以帮助我吗?
示例:
TipoLog.php:
public function insert(){
$data = array(
$this->alias => array(
'id' => 99,
'descricao' => 'Testing 123',
),
);
$this->getDataSource()->begin();
$result = $this->save($data);
$this->getDataSource()->rollback(); // should undo $this->save
return $result;
}
在控制器上执行时,效果很好:
MyController.php
public function teste() {
$this->autoRender = false;
$this->loadModel('ControleFrequencia.TipoLog');
$id = 99;
debug($this->TipoLog->findById($id)); //returns nothing - OK
$this->TipoLog->insert($id);
debug($this->TipoLog->findById($id)); //returns nothing - OK
}
但是当我执行测试用例时,回滚不起作用:
MyTestCaseTest.php
public function testTest() {
$TipoLog = ClassRegistry::init('ControleFrequencia.TipoLog');
$id = 99;
debug($TipoLog->findById($id)); //returns nothing - OK
$TipoLog->insert($id);
debug($TipoLog->findById($id)); //returns the inserted row - NOT OK
}
SQL-测试用例的日志
...
192 BEGIN
193 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
194 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
195 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`descricao` = 'Testing 123' AND `TipoLog`.`id` != 99
196 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
197 SELECT COUNT(*) AS `count` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99
198 INSERT INTO `my_db_test`.`tipo_log` (`id`, `descricao`) VALUES (99, 'Testing 123')
199 ROLLBACK
200 SELECT `TipoLog`.`id`, `TipoLog`.`descricao` FROM `my_db_test`.`tipo_log` AS `TipoLog` WHERE `TipoLog`.`id` = 99 LIMIT 1
database.php
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'myhost',
'login' => 'mylogin',
'password' => 'mypass',
'database' => 'my_db',
'prefix' => '',
);
public $test = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'myhost',
'login' => 'mylogin',
'password' => 'mypass',
'database' => 'my_db_test',
'prefix' => '',
);
这是因为,默认情况下,CakePHP fixtures 使用 MEMORY
不支持事务功能的数据库引擎。
https://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
您可以通过 运行 debug($this->query("SHOW CREATE TABLE tipo_log;"));
在测试中的某处进行检查。
要解决此问题,您需要将灯具 class $canUseMemory
属性设置为 false
。这将使您的灯具使用数据库引擎,您的 table 是用
喜欢下一个:
class TipoLogFixture extends CakeTestFixture {
public $canUseMemory = false;
public $import = ['model' => 'TipoLog'];
public $records = [
...
];
}