🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

解決済

1回答

1153閲覧

user_spec.rb 内でsession を使用したい

gozikyu

総合スコア4

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

0クリップ

投稿2021/01/24 23:21

前提・実現したいこと

バックエンドにrails-apiモード、フロントにreactを使用しています。

rspecでsession[:user_id] = user.idによりログイン状態を作りたいのですが、sessionがundefined methodということで使用することができません。
users_controller内では使用できるのですが、なぜrspecでは使用できないのか分からずにおります。

※↓のソースコードの最後のテストでsessionを使用しています。

ご知見ございます方いらっしゃいましたらアドバイスいただけると幸いです。

発生している問題・エラーメッセージ

NameError: undefined local variable or method `session' for #<RSpec::ExampleGroups::User:0x00005558cc6b4930>

該当のソースコード

require 'rails_helper' RSpec.describe User, type: :model do user = FactoryBot.build(:user) it 'should be vaild' do expect(user).to be_valid end it 'name should be present' do user = FactoryBot.build(:user, name: '') expect(user).not_to be_valid end it 'name should be not be too long' do user = FactoryBot.build(:user, name: 'a' * 51) expect(user).not_to be_valid end it 'email should be present' do user = FactoryBot.build(:user, email: '') expect(user).not_to be_valid end it 'email should be not be too long' do user = FactoryBot.build(:user, email: "#{'a' * 244}@example.com") expect(user).not_to be_valid end it 'email validation should accept valid addresses' do valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org first.last@foo.jp alice+bob@baz.cn] valid_addresses.each do |valid_address| user = FactoryBot.build(:user, email: valid_address) expect(user).to be_valid end end it 'email validation should reject invalid addresses' do invalid_addresses = %w[user@example,com user_at_foo.org user.name@example. foo@bar_baz.com foo@bar+baz.com foo@bar..com] invalid_addresses.each do |invalid_address| user = FactoryBot.build(:user, email: invalid_address) expect(user).not_to be_valid end end it 'email addresses should be unique' do duplicate_user = user.dup user.save expect(duplicate_user).not_to be_valid end it 'email addresses should be saved as lower-case' do mixed_case_email = 'HogE@GmaiL.coM' user = FactoryBot.build(:user, email: mixed_case_email) user.save expect(user.reload.email).to eq mixed_case_email.downcase end ******//こちらでsessionを使用しています。****** it 'should be rejected when edit as wrong user' do user=FactoryBot.create(:user) Another=FactoryBot.create(:Another) session[:user_id] = user.id expect(patch user_path(Another), params:{user: {name:'update'}}).to have_http_status(404) end end

試したこと

spec内にapi/spec/support/rspec_helper.rbを作成し、以下のようなヘルパーを作成しましが、同様のエラーがでてしまいました。

def log_in_as(user) session[:user_id] = user.id end

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのテストはRSpec.describe User, type: :model do でなく、
RSpec.describe 'User', type: :request do でやってください。
post のテストなのですから。

投稿2021/01/25 00:55

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gozikyu

2021/01/25 10:56

ありがとうございます。 おっしゃる通り、RSpec.describe 'User', type: :request do に記述したらうまくいきました! 後学のために教えていただきたいのですが、なぜ、post methodはRSpec.describe 'User', type: :request do でしか使えないのでしょうか? 他のrspecではundefinedとなってしまったのですが、その理由がわからずにいます、、、 お時間ございます時にご教示いただけると幸いです。
winterboum

2021/01/25 13:25

modelにはそもそもpostなどというmethodはないので、type: :model には用意されて居ません
gozikyu

2021/01/26 11:38

model やrequestといったtypeは単に名前をつけているだけでなく、使用できるメソッドもtypeに依存するのですね。 ご教示いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問