通过 Codeception 使用存在规则测试 Laravel 5 路由

Posted

技术标签:

【中文标题】通过 Codeception 使用存在规则测试 Laravel 5 路由【英文标题】:Testing a Laravel 5 route with an exists rule via Codeception 【发布时间】:2016-01-10 04:58:36 【问题描述】:

我正在使用 Codeception 库为我的 Laravel 应用程序编写测试。我正在使用Laravel5 module,并为其配置了cleanup,这意味着所有测试都将在数据库事务中运行,这样我的测试数据库就不会被测试数据填充。

我正在测试的端点之一通过表单请求针对它设置了以下验证规则:

public function rules()

    return ['user_id' => 'required|exists:users,id'];

我写的 POST 到这个端点的测试如下:

public function store(ApiTester $I)

    // Create a couple of users
    $users = factory(\App\Models\User::class, 2)->create();

    $I->wantTo('ask someone to be my friend');
    $I->authenticateAs($users[0]);
    $I->sendPOST('users/' . $users[0]->id . '/friendships', [
        'user_id' => $users[1]->id
    ]);
    $I->seeResponseCodeIs(201);

此测试总是失败。经过调查,我可以看到它失败了,因为由于exists:users,id 规则,请求验证失败。如果我将 Codeception 设置更改为不在事务中执行测试,Laravel 的验证器可以成功地看到我在测试开始时创建的两个用户的存在并且测试通过。

所以,我的问题是,有什么方法可以保持将每个测试包装在数据库事务中的行为,并让 Laravel 的验证器能够看到我在测试中创建的记录?

【问题讨论】:

我有完全相同的问题,任何帮助将不胜感激 能否在您的问题中添加套件配置? 【参考方案1】:

问题是,如果事务没有提交,数据库表中的原始数据不受影响。因此,在事务中,您创建了两个用户,但没有提交语句将其持久保存到您的数据库中。因此,laravel 验证规则“存在”找不到它们(该规则发出数据库请求以查找特定的 user_id )。

因此,在您的情况下,用户必须在测试之前存在。我建议改用迁移。 Resetting Database after each test

使用数据库迁移和种子创建表,并在测试完成后回滚它们。

【讨论】:

我希望能够避免在每次测试之前迁移我的数据库。与在事务中执行相比,这似乎会带来很高的性能损失。我不太明白的是,Laravel 的验证器怎么看不到我创建的用户,是 Laravel 和 Codeception 使用两个不同的数据库连接吗?【参考方案2】:

引用:

$I->sendPOST('users/' . $users[0]->id . '/friendships', [
    'user_id' => $users[1]->id
]);

为什么你在请求url中发送$users[0]->id,然后在参数中发送'user_id' => $users[1]->id

这可能是您的问题吗?这可能是您未能通过验证的原因吗?

【讨论】:

这不是问题。此端点接受您要求成为朋友的 另一个 用户的用户 ID。

以上是关于通过 Codeception 使用存在规则测试 Laravel 5 路由的主要内容,如果未能解决你的问题,请参考以下文章

Codeception 无法点击它之前看到的元素

如何使用 selenium 和 codeception 检测验收测试中的 dom 变化

Codeception 验收测试在浏览器启动之前运行

使用 Xdebug 调试 Codeception 测试

Codeception:哪些测试组组合是可能的?

Yii2中如何使用CodeCeption