[解決済み] リクエスト仕様における認証のスタブ化
2023-05-01 19:12:35
質問
リクエスト仕様を書くとき、セッションやスタブコントローラメソッドをどのように設定するのでしょうか? 私は統合テストで認証をスタブ化しようとしています - rspec/requests
以下はテストの例です。
require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/authentication_helpers'
describe "Messages" do
include AuthenticationHelpers
describe "GET admin/messages" do
before(:each) do
@current_user = Factory :super_admin
login(@current_user)
end
it "displays received messages" do
sender = Factory :jonas
direct_message = Message.new(:sender_id => sender.id, :subject => "Message system.", :content => "content", :receiver_ids => [@current_user.id])
direct_message.save
get admin_messages_path
response.body.should include(direct_message.subject)
end
end
end
ヘルパーです。
module AuthenticationHelpers
def login(user)
session[:user_id] = user.id # session is nil
#controller.stub!(:current_user).and_return(user) # controller is nil
end
end
そして、認証を処理するApplicationControllerです。
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
helper_method :logged_in?
protected
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def logged_in?
!current_user.nil?
end
end
なぜこれらのリソースにアクセスできないのでしょうか?
1) Messages GET admin/messages displays received messages
Failure/Error: login(@current_user)
NoMethodError:
undefined method `session' for nil:NilClass
# ./spec/requests/authentication_helpers.rb:3:in `login'
# ./spec/requests/message_spec.rb:15:in `block (3 levels) in <top (required)>'
どのように解決するのですか?
リクエスト仕様とは
ActionDispatch::IntegrationTest
の薄いラッパーで、コントローラの仕様 (コントローラの仕様は
ActionController::TestCase
). セッションメソッドが用意されていても、それがサポートされているとは思えません(つまり、他のユーティリティのためにインクルードされるモジュールもそのメソッドを含んでいるので、そこにあるのでしょう)。
ユーザー認証に使うどんなアクションでも、投稿でログインすることをお勧めします。すべてのUserファクトリーのパスワードを'password'(例)にすれば、次のようなことができます。
def login(user) post login_path, :login => user.login, :password => 'パスワード'. 終了
関連
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み] PGError: エラー: リレーションのカラムが存在しない
-
[解決済み] Railsのインストール時に「/usr/binディレクトリに書き込み権限がありません」というエラーが発生しますが、どのように修正すればよいですか?
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み】RSpecで単一のテスト/仕様ファイルを実行するにはどうすればよいですか?
-
[解決済み] Rake 0.9.0での未定義メソッド'task'の使用について
-
[解決済み] rails3プロジェクトからgemsをアンインストールする最良の方法は何ですか?
-
[解決済み] Herokuで2つのアプリの間でデータベースを共有する
-
[解決済み] Railsのバンドルインストールは本番のみ
-
[解決済み] Postgres エラー "パラメータ "TimeZone" に無効な値があります。"UTC"
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rails 3 - link_to を image_tag + text で表示する。
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み] Herokuのデータベースを空にする方法
-
[解決済み] githubからあるgemの特定の「コミット」を取得するには?
-
[解決済み] 既存のRailsカラムのbooleanに:default => trueを追加する。
-
[解決済み] サインアップするためのDeviseルートを削除するにはどうすればよいですか?
-
[解決済み] Rake 0.9.0での未定義メソッド'task'の使用について
-
[解決済み] EmacsのRubyオートコンプリートがほぼ使えるようになった
-
[解決済み] rails3プロジェクトからgemsをアンインストールする最良の方法は何ですか?
-
[解決済み] カピバラさん曖昧さ解消