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

Testing a Laravel 5 route with an exists rule via Codeception

我正在使用 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 的验证器能够看到我的记录在我的测试中创建?

引用:

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

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

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

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

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

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