Podczas pisania specyfikacji żądania, jak ustawić sesje i/lub metody kontrolerów stacyjnych? Próbuję skrótową z uwierzytelniania w moich testów integracyjnych - rspec/żądaAutoryzacja zaszywania na żądanie Spec
Oto przykład testu
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
Pomocnik:
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
A ApplicationController który obsługuje uwierzytelnianie :
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
Dlaczego nie jest to możliwe? ble, aby uzyskać dostęp do tych zasobów?
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)>'
Dzięki David. Działa świetnie, ale wydaje się, że jest trochę przesadą, wykonując wszystkie te prośby? –
Gdybym myślał, że to przesada, nie poleciłbym tego :) –
To także najprostszy sposób, aby zrobić to niezawodnie. 'ActionDispatch :: IntegrationTest' ma symulować jednego lub więcej użytkowników wchodzących w interakcje za pośrednictwem przeglądarki, bez konieczności korzystania z prawdziwych przeglądarek. Istnieje potencjalnie więcej niż jeden użytkownik (tj.sesja) i więcej niż jeden kontroler w jednym przykładzie, a obiekty sesja/kontroler są tymi używanymi w ostatnim żądaniu. Nie masz do nich dostępu przed żądaniem. –