通过Codeception测试具有存在规则的Laravel 5路由

时间:2015-10-12 16:21:15

标签: php laravel transactions laravel-5 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的验证器能够看到我在测试中创建的记录?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

引用:

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

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

这可能是你的问题吗?这可能是你验证失败的原因吗?