数据库事务在Laravel 5的代码中不起作用?

时间:2015-12-02 07:15:26

标签: php laravel transactions laravel-5 codeception

我正在尝试使用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模块cleanuppopulate设置为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)

1 个答案:

答案 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
        );