Codeceptionライブラリを使用してLaravelアプリケーションのテストを書いています。私はLaravel5モジュールを使用しておりcleanup
、すべてのテストがデータベーストランザクション内で実行されるように構成されているため、テストデータベースがテストデータでいっぱいになることはありません。
私がテストしているエンドポイントの1つには、フォームリクエストを介して設定された次の検証ルールがあります。
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のバリデーターは、テストの開始時に作成した2人のユーザーの存在を正常に確認でき、テストに合格します。
だから、私の質問は、データベーストランザクションで各テストをラップする動作を維持し、Laravelのバリデーターがテストで作成したレコードを表示できるようにする方法はありますか?
問題は、トランザクションがコミットされていない場合、データベーステーブルの元のデータが影響を受けないことです。したがって、トランザクション内で2人のユーザーを作成しますが、それをデータベースに保持するコミットステートメントはありません。したがって、laravel検証ルール「exists」はそれらを見つけることができません(そのルールは特定のuser_idを見つけるためにデータベース要求を行います)。
したがって、あなたの場合、ユーザーはテストする前に存在している必要があります。代わりに移行を使用することをお勧めします。各テスト後にデータベースをリセットする
データベースの移行とシードを使用してテーブルを作成し、テストの終了後にロールバックします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加