Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、propertyテーブルをテストする【3】登録時のエラーテストを実装する

propertyテーブルが関係するテストを実装しています。

正常動作時のテストは実装しましたので、エラー時のテストを実装していきます。

bookdataテーブル時と同様に新規登録から順に作成していきます。

今回の目的

Propertyテーブルに関連する設定で、想定されるエラーに対しての動作が正常にできていることを確認する

なぜやるか

バリデーションなどエラーに対しての処理が正常に行えている担保をとるため

やりたいこと

  • 想定されるエラーに対してのエラー表示がされていることを確認する
  • リダイレクト処理が正常にできていることを確認する

やったこと

  • 書籍タイトルなしで登録する
  • 登録されていない書籍を登録する
  • Property登録済み書籍を重複登録する
  • 他人ユーザーで登録しようとする

実施内容

新規登録に対してのエラーチェック

所有している書籍を新規に登録するページからチェックを行います。

登録書籍タイトル未入力をチェックする

所有している書籍の情報登録はこんなサイトでした。

 

f:id:Fippiy:20190509112556p:plain

所有書籍登録

書籍情報として登録されている本のタイトル名が表示されます。

ここから登録する本を選択して、付加情報を入力し登録することができます。

 

今回の設定では、タイトル名は必須とし、その他は任意入力となっています。

タイトル名は選択方式になっている為、未入力になることはない想定ですが、

将来の入力方式変更も見据え必須としている以上、未入力状態時にエラーになることを確認します。

# ~/tests/Feature/PropertyTest.php

//// NGパターン調査
// タイトル未入力
public function test_propertyControll_ng_notNameEntry()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

//// タイトル情報なしで登録
$propertydata = [
'bookdata_id' => null,
];
$propertydatapath = 'property/create';
$response = $this->from($propertydatapath)->post('property', $propertydata);
 // 本情報保存
$response->assertSessionHasErrors(['bookdata_id']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect($propertydatapath); // 同ページへリダイレクト
$this->assertEquals('bookdata idは必須です。',
session('errors')->first('bookdata_id')); // エラメッセージを確認
}

テスト用ユーザーを作成し、フォーム入力情報として本のタイトルを設定しています。

タイトル名を記入するイメージですが、実際には書籍情報のidを参照して登録することになるので、bookdata_idとしてpost送信しています。

そして、タイトル未入力なので、nullとしてテストデータを準備しています。

その後は、エラーが表示されていることを確認して完了です。

 

登録書籍重複をチェックする

自分が所有済みとなっている本を重複して登録すると同じ本が複数表示されてしまいます。

これでは同じ本がいくつも表示され管理しているとは言えません。

予め重複登録はエラーとして処理されるように作成しているので、これをテストします。

# ~/tests/Feature/PropertyTest.php

// タイトルユニーク
public function test_propertyControll_ng_uniqueNameEntry()
{
// property 自動生成 // 関連 user,bookdataも作成
$propertydata = factory(Property::class)->create();
 
// ユーザーログイン
$user = User::first(); // 作成済みユーザー情報取得
$this->actingAs($user); // 選択ユーザーでログイン
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

$propertydata = [
'bookdata_id' => $propertydata->bookdata_id,
];
$savepropertypath = 'property/create'; // 新規作成パス
$response = $this->from($savepropertypath)->post('property', $propertydata); // 保存
$response->assertSessionHasErrors(['bookdata_id']); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect($savepropertypath); // 同ページへリダイレクト
$this->assertEquals('bookdata idは既に存在します。',
session('errors')->first('bookdata_id')); // エラメッセージを確認
}

Propertyファクトリーにてテストデータを1件作成します。

ファクトリー内でuserとbookdataも自動生成される為、この1行でテストデータが全て作成できています。

ユーザーが作成できているので、次で作成済みユーザー情報を取得してログインを実施。

次に登録するPropertyデータの作成です、ここで今回は重複した本を登録することを再現するので、作成済みのbookdata_idとして登録処理を実施しました。

これで、登録済みの為、既に存在していますとメッセージが返ってくればテストとしては完了します。

 

他人ユーザーで登録する

ログインユーザーでしか登録できないようになっていますが、あえてログイン中ユーザーとは別のユーザーで処理された時に対してテストを実施しました。

 # ~/tests/Feature/PropertyTest.php

// 別のユーザーで登録
public function test_propertyControll_ng_unMatchUserEntry()
{
// 書籍情報作成
$bookdata = factory(Bookdata::class)->create();

//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

$otheruser = factory(User::class)->create(); // 別のユーザーを作成

//// 登録
$propertydata = [
'bookdata_id' => $bookdata->id,
'user_id' => $otheruser->id,
]; // ログインユーザー以外で強制登録
$propertydatapath = 'property/create';
$response = $this->from($propertydatapath)->post('property', $propertydata);
 // 本情報保存
$response->assertStatus(500); // 500エラーであること
}

ログインまでは、書籍重複チェック時と同じです。その後に別のユーザーを準備しています。

そして、所有書籍登録時に他人のユーザーidを指定しました。

ログインユーザーではないので、処理としては実施できずエラー表示となりますので、500エラーが帰ってきていることを確認して完了です。

 

以上で、エラーチェックの新規登録編は完了です。

残りの工程は別記事で作成します。