2015-12-02 63 views
1

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

回答

0

下面是一些可能有所帮助 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 
     );