0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

deviceを使わないrequest specの基本的なテスト(Userモデルver.)

Posted at

まずは超基本テスト

WebブラウザからWebサーバーへHTTPリクエストを送り、Webサーバーから正常なHTTPレスポンスが返ってくるとき、そのHTTPレスポンスのHTTPステータスコードは200を返します。

spec/requests/user_spec.rb
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]

users_controller.rb
def login
    @user = User.find_by(
      email: params[:user][:email],
      password: params[:user][:password]
    )
...省略...
end

コメント②
userはresourcesを使ってルーティングしているのでurlの指定が少し独特です。
_pathヘルパーを使ってコントローラ#アクションを指定するのに、以下の記事が大変参考になります。
Railsのルーティングまとめ

#テストちょっと増やしてみる

spec/requests/user_spec.rb
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でうまくいかない時の原因調査のちょっとしたハック

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?