
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であるはずです。