2015-10-12 6 views
10

私はLaredvelアプリケーションのテストを、Codeceptionライブラリを使用して作成しています。私はLaravel5 moduleを使用しており、cleanupで構成されています。つまり、すべてのテストがデータベーストランザクション内で実行されるため、テストデータベースがテストデータで満たされません。Codeceptionを使用して存在規則を持つLaravel 5ルートをテストする

public function rules() 
{ 
    return ['user_id' => 'required|exists:users,id']; 
} 

次のように私はこのエンドポイントに投稿するように書かれてきたテストは次のとおりです:

私はテストがフォーム要求を経由して、それに対して設定し、次の検証ルールを持っているんだ、エンドポイントの

ワン

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のバリデーターは、テストの開始時に作成した2人のユーザーの存在を正常に確認でき、テストに合格します。

私の質問は、データベーストランザクションで各テストをラップし、テストで作成したレコードをLaravelのバリデータで確認できるようにする方法はありますか?

+0

私はまったく同じ問題を抱えています。何か助けていただければ幸いです – Fabrizio

+0

あなたの質問にスイート構成を追加できますか? – Naktibalda

答えて

4

トランザクションがコミットされない場合、データベーステーブル内の元のデータには影響しません。したがって、トランザクション内では2人のユーザーを作成しますが、それをデータベースに保持するコミット・ステートメントはありません。したがって、ラベール検証ルール 'exists'はそれらを見つけることができません(そのルールは特定のuser_idを見つけるためのデータベース要求を作成します)。

あなたのケースでは、テストの前にユーザーが存在する必要があります。代わりにマイグレーションを使用することをお勧めします。 Resetting Database after each test

データベースの移行とシードを使用してテーブルを作成し、テストが終了したらロールバックします。

+0

私はすべてのテストの前に自分のデータベースの移行を避けることを望んでいました。それは、トランザクション内での実行と比較して、パフォーマンス上のペナルティがあるようです。私が実際に理解していないことは、Laravelのバリデーターが私が作成したユーザーを見ることができない、LaravelとCodeceptionが2つの異なるデータベース接続を使用していることです。 –

0

引用:なぜあなたはパラメータの要求URLで$users[0]->id、その後'user_id' => $users[1]->idを送信している

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

これは問題がありますか?これが検証に失敗した理由ですか?

+0

これは問題ではありません。このエンドポイントは、友人であることを求めている*別の*ユーザーのユーザーIDを受け入れます。 –