我正在尝试使用Codeception来管理Laravel 5中的数据库事务来测试我的API。 Laravel 5模块documentation在配置部分清楚地说明了:
cleanup:boolean,默认为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
,以便不使用dump
,而是使用数据库{{1 } transactions
模块正在反转Laravel5
状态。
现在这是一个简单的测试:
Db
它基本上在Db中保留注释并对API响应执行基本断言,并最终检查记录是否确实在Db中持续存在。当我运行它时,它运行正常并返回绿色。但是我检查了Db并且评论仍然存在。我再次运行它,我看到另一个新的评论。根据我的理解,在测试运行完毕后,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"
]);
运行正常。但是当我一起运行它们时:
sudo codecept run api CreateCommentCept
所有测试都失败了。我很困惑为什么会这样。当我将我的REST依赖项更改为PhpBrowser而不是Laravel5模块时,这不会发生。
PS:我正在使用Codeception(2.1.3)
答案 0 :(得分:0)
这可能是有帮助的 Laravel5 Module: disable cleanup #2525
这里janhenkgerritsen评论
Laravel 5模块的$ config变量是公共的,所以你可以 通过添加帮助程序自己更改此数组中的清理条目。 这对你现在有用。我将添加建议的方法 我有时间的模块。
和
经过一番思考后,我决定不向模块添加方法 禁用/启用清理。在我看来,用例非常罕见 如果你遇到它,你可以轻松改变行为 帮手。
我建议你按照janhenkgerritsen在评论中提到的方式进行操作。我不建议编辑供应商文件,但我暂时做的是
找到 vendor / 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
);