Request Rspecを書く練習をしました。
意味を忘れやすいので、以下の下書きと併せて記録しておきます。
require "rails_helper" RSpec.describe “(どのモジュールに属するかなどの説明文)”, type: :request do describe “アクセス制御” do context “(テストの条件)” do let!(:student) { create(:classroom, :age).student } it “期待する動作” do sign_in student get student_classroom_path(classroom) expect(response).to have_http_status :ok end end end end
require "rails_helper"
この記述はほぼすべてのテストファイルで必要。
ファイル内のテストを実行するためにRaailsアプリの読み込みが必要であることを伝えています。
RSpec.describe "アクセス制御", type: :request do
describe
ブロックでは、通常、テスト対象のオブジェクトやクラスに関する情報を記述しますが、その後にtypeを指定することもできます。
type
はテストのグルーピングやテストランナーへの情報提供のために使用されます。
request
は HTTPリクエストとルーティングに関連するテストを実行する場合に使用されます。
describe "GET /index(テストの対象)" do
期待する結果をまとめて書くならdescribe
を使って" "内に書くことができます。
この場合はGET /index
の実行結果を期待します。
context "テストの条件" do
context
はスペックを読みやすくするためにあります。
まとめるときに使ってもよいのだそう。
let!(:student) { create(:classroom, :age).student }
let!
は、各テストのブロック実行前に定義した定数をつくります。
この場合は変数student
にデータ生成ライブラリを使用して作成したオブジェクト{}内を代入しています。
it "期待する動作" do
it
で始まる1行につき一つの結果が得られるように書いています。
そのほうが失敗したときに原因の調査がしやすいからです。
it
のあとの" "は必須ではないですが、書いたほうが何を意図して書いているかが読み手に伝わりやすいです。
sign_in student
ログイン状態を作ることができるsign_in
メソッド。
ヘルパーやgemで定義されているものを使えます。
get student_classroom_path(classroom)
Request Specではget、postなどのメソッドを使ってHTTPリクエストを送信することができます。
expect(response).to have_http_status :ok
expect(response)
これはRSpecのアサーションブロックの始まりです。
response
は通常、Railsコントローラーのアクションをテストした結果として得られるHTTPレスポンスオブジェクトを指します。
.to
アサーションの期待値を指定するためのメソッドです。
この場合、期待する条件は :ok
であることです。
have_http_status :ok
これはアサーションの本体で、HTTPレスポンスのステータスコードが :ok (HTTPステータスコード 200 OK) であることをテストします。
つまり、コントローラーアクションが成功した場合、HTTPレスポンスのステータスコードは200 OKであるはずです。