数据库事务在代码化Laravel 5中不起作用?
我正在尝试使用Codeception在Laravel 5中处理数据库事务以测试我的API。该Laravel 5模块documentation清楚地说,在配置部分规定:数据库事务在代码化Laravel 5中不起作用?
清理:布尔型,默认值是true - 所有的数据库查询将在 交易,这将在测试结束时回滚运行。
我codeception.yml文件看起来像这样:
actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
settings:
bootstrap: _bootstrap.php
colors: true
memory_limit: 1024M
extensions:
enabled:
- Codeception\Extension\RunFailed
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=carparts'
user: 'root'
password: 'password'
dump: tests/_data/dump.sql
我api.suite.yml文件看起来像这样:
class_name: ApiTester
modules:
enabled:
- Laravel5
- Db
- PhpBrowser:
url: 'http://localhost:8000/api'
curl:
CURLOPT_RETURNTRANSFER: true
- REST:
url: http://localhost:8000/api/
depends: Laravel5
config:
Laravel5:
environment_file: .env.testing
Db:
cleanup: false
populate: false
在这里,我已经取得了Db
模块cleanup
和populate
设置为false
以便不使用,而是使用来自Laravel5
模块的数据库transactions
正在反转Db
状态。
现在,这里是一个简单的测试:
<?php
changeToTenantDb('carparts');
$I = new ApiTester($scenario);
$I->wantTo('create a new comment');
$I->useToken();
$I->sendPost('comments', [
"document_id" => "1",
"comment_type_id" => "1",
"user_id" => "1",
"body" => "Testing"
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
$I->seeResponseContainsJson(['status' => 'success']);
$I->seeInDatabase('comment', [
"document_id" => "1",
"comment_type_id" => "1",
"user_id" => "1",
"body" => "Testing"
]);
它基本上坚持在一个数据库中的注释和API响应执行基本断言,最后检查是否记录实际上并在数据库中存在。当我运行这个时,它运行良好并且回到绿色。但我检查了Db,评论仍然存在。我再次运行它,我看到另一个新的评论。据我了解,在测试完成后,Db交易应该回滚到原始状态。我究竟做错了什么?
而且如果我进行的测试,像这样:
sudo codecept run api CreateCommentCept
运行良好。但是当我将它们运行在一起时:
sudo codecept run api
所有测试都失败。我完全困惑为什么会发生这种情况。当我将REST依赖关系改为PhpBrowser而不是Laravel5模块时,这不会发生。
PS:我使用Codeception(2.1.3)
下面是一些可能有所帮助 Laravel5 Module: disable cleanup #2525
这里janhenkgerritsen评论
的Laravel 5模块的$配置变量是公开的,所以你可以通过添加一个助手来改变这个数组中的清理条目。 现在就为你工作。当我有一些时间时,我会将建议的方法添加到 模块。
和
经过一番思考,我决定不要的方法来将模块添加到 禁用/启用清理。这个用例在我看来很少见,如果碰到它,你可以很容易地用 助手来改变行为。
我建议你在janhenkgerritsen他comment.I不建议编辑供应商的文件,但我就是这样做的时候被提及的方式做的是
找到供应商/ codeception/codeception/src/Codeception/Module/Laravel5.php并编辑下面的代码。将cleanup
更改为false
$this->config = array_merge(
[
'cleanup' => false,
'environment_file' => '.env',
'bootstrap' => 'bootstrap' . DIRECTORY_SEPARATOR . 'app.php',
'root' => '',
'packages' => 'workbench',
'disable_middleware' => false,
'disable_events' => false,
],
(array)$config
);