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

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

Laravel開発、ページネーション機能をつける【3】検索フォーム修正に伴うテストを修正する

ページネーション機能を設定するなかで、検索ページに関してはフォームメソッドをpostからgetへ変更しました。

このため、テストが通らなくなりました。テストについてもpost通信を想定した記述となっているためです。

ページネーションテストの前に、作成済みのテストを修正する必要が有るので、こちらを実施します。

今回の目的

既存フォームメソッド変更に伴うテストを修正し正常動作を確認する

なぜやるか

テストによる正常動作担保を継続するために、アプリ修正に伴う箇所についてテスト側も修正を実施するため

やりたいこと

  • 検索方法をpostからgetに変更した内容でテストできるようにする

やったこと

  • 既存のテストを実施して問題箇所を確認する
  • フォーム送信テストのメソッドを変更する
  • requestオブジェクト取得方法を変更する
  • 残りのテストについても修正を実施する

実施内容

既存テストを実施する 

ページネーション機能を作成しましたので、ページネーションに対してのテストを行う前に、既存のテストが問題ないことを確認していましたが、テストに失敗する項目があります。

  1. 検索、書籍があった時
  2. 検索、書籍がなかった時
  3. 検索、ワードなしで検索

この3つのテストの共通点は、検索フォームから入力した文字を元に検索した結果を確認しています。

しかし、今回のページネーション実装時にフォーム送信データのメソッドをpostからgetに変更しましたが、テストの記述はpostのままでありメソッド相違による問題が発生しています。

そこで、ページネーションに対してのテストを実施する前にメソッド相違問題を解決します。

 

検索テストを修正する

検索書籍ありのテストを修正する

まずは、検索結果として書籍がみつかったパターンを修正していきます。 

post送信テストの記述をそのままgetに変更してみるもエラーのままとなりました。

$response = $this->from($find_post)->get($find_post,
 ['find' => $bookdata->title]); // 検索実施

postをgetに変更してみたところで、検索結果が表示されていません。このため、結果から検索対象タイトルを探そうとしても、そもそも結果がないので失敗します。

 

そこでまずはテスト時のメソッドの扱いをあらためて確認しました。こちらを参考にさせて頂きました、ありがとうございます。

readouble.com

カスタムHTTPリクエストが行える形式としてgetメソッドを書き換えます。

# ~/tests/Feature/BookdataTest.php

// 検索書籍有り
public function test_findTitle_ok_yesMatchFindTitle(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // faker book自動生成
 $bookdata = factory(Bookdata::class)->create();
 // 検索
 $find_post = 'book/find'; // 検索パス
 $response = $this->get($find_post); // 検索ページへアクセス
 $response->assertStatus(200); // 200ステータスであること
 $response->assertViewIs('book.find'); // book.findビューであること
 $response = $this->call('GET', 'book/search', ['find' => $bookdata->title]);
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること
 $response->assertSeeText($bookdata->title); // bookdataタイトルが表示されていること
}

参考サイトを元にcallによる記述へと変更しました。

カスタムリクエストによる完全なresponseオブジェクトを取得するにはcallを利用することで取得できるとありました。

これでテストが通るようになりました。今回の記述にかかわらず今までのpostテストもこちらに統一した方がいいかもしれません…。

まずフォームからget送信によるテストが可能となりました。

修正箇所が分かったので残りのテストも修正します。

 

残りのテストも修正する

検索書籍がなかった時のテストを修正。

# ~/tests/Feature/BookdataTest.php

// $response = $this->from($find_post)->post($find_post, ['find' => 'b']);
$response = $this->call('GET', 'book/search', ['find' => 'b']);

検索ワードなし時のテストを修正。

# ~/tests/Feature/BookdataTest.php

// $response = $this->from($find_post)->post($find_post, ['find' => '']);
$response = $this->call('GET', 'book/search', ['find' => '']);

いずれも修正方法は同じです。これにより既存のテストについてはまずエラーとならずに正常完了となりました。

 

検索メソッド変更によるテスト修正は完了しました。

次は所有書籍情報に対してのページネーション対応を実施していきます。