요청 사양을 작성할 때 세션 및/또는 스텁 컨트롤러 메서드를 어떻게 설정합니까? 나는 내 통합 테스트에서 인증을 스텁하기 위해 노력하고있어 - RSpec에/여기요청 사양의 스텁 인증
를 요청하는 테스트의 예
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'는 실제 브라우저를 사용하지 않고도 브라우저를 통해 상호 작용하는 한 명 이상의 사용자를 시뮬레이트하도록 설계되었습니다. 잠재적으로 둘 이상의 사용자가 있습니다 (예 :세션) 및 한 개 이상의 컨트롤러를 포함하며, 세션/컨트롤러 개체는 마지막 요청에서 사용 된 개체입니다. 요청하기 전에 액세스 할 권한이 없습니다. –