まずは超基本テスト
WebブラウザからWebサーバーへHTTPリクエストを送り、Webサーバーから正常なHTTPレスポンスが返ってくるとき、そのHTTPレスポンスのHTTPステータスコードは200
を返します。
require 'rails_helper'
RSpec.describe "Sessions", type: :request do
describe "GET users" do
let(:test_user) { create(:user) }
before do
session_params = { user: { email: test_user.email, password: test_user.password } }
post "/login", params: session_params #コメント①
get posts_path #コメント②
end
it "つぶやき一覧ページのリクエストが成功していること" do
expect(response).to have_http_status(200)
end
end
end
コメント①
自分はdevice
というgemを使用していないのでログインを手書きしました。(何やらdeviceを使えばsign_in
というヘルパーメソッドを使ってこの部分を表現できるらしい)
自分の場合だと以下のコントローラーのように[:user]の中に[:email]を入れているのでそういう構造になるようにsession_params
を設定しました。
この設定はこちら↓の記事を参考にさせていただきました。
Rspecでサインインメソッドを共通化して切り出す(devise使わないとき)[system spec][request spec]
def login
@user = User.find_by(
email: params[:user][:email],
password: params[:user][:password]
)
...省略...
end
コメント②
userはresourcesを使ってルーティングしているのでurlの指定が少し独特です。
_pathヘルパーを使ってコントローラ#アクションを指定するのに、以下の記事が大変参考になります。
Railsのルーティングまとめ
#テストちょっと増やしてみる
require 'rails_helper'
RSpec.describe "Sessions", type: :request do
describe "GET users" do
let(:test_user) { create(:user) }
let(:test_post) { create(:post, user: test_user) } ########### 追加 ###########
before do
session_params = { user: { email: test_user.email, password: test_user.password } }
post "/login", params: session_params
test_post ########### 追加 ###########
get posts_path
end
it "つぶやき一覧ページのリクエストが成功していること" do
expect(response).to have_http_status(200)
end
it "つぶやきの内容を取得していること" do ########### 追加 ###########
expect(response.body).to include test_post.content
end
end
end
ログインした後にtest_post
を作成してからpost一覧ページへ飛んでいます(get posts_path
)。
これでつぶやきの内容がレスポンスでやってきたwebページに含まれているかテストしています。
post一覧ページへ飛ぶ(get posts_path
)前にtest_post
と一行書いてあるのがポイントです。
今回は遅延評価のlet
を使用しているので、test_post
が参照された時にlet
の行が実行されます。したがって、ここでtest_post
を加えないとtest_post
が作成されないままpost一覧ページへ飛んでしまうのでエラーになってしまいます。
参考
その他参考にさせていただいた記事です。ありがとうございました。
Railsチュートリアル(3章〜8章) request specを用いた実装
rspecのrequest specでうまくいかない時の原因調査のちょっとしたハック