rail3/rspec/devise: тест контроллера rspec завершится неудачно, если я не добавлю dummy=subject.current_user.inspect
Я пытаюсь заставить RSpec работать для простого скаффолдингового приложения, начиная с тестов скаффолдов rspec.
В вики для устройства я добавил различные записи конфигурации устройства, фабрику для пользователя и администратора, и первое, что я делаю в своем контроллере спецификаций, это login_admin.
Странная вещь, хотя... все мои спецификации терпят неудачу, ЕСЛИ Я не добавляю следующее утверждение сразу после it ... do
линия:
dummy=subject.current_user.inspect
(Со строкой, как показано ниже, спецификации проходят. Без этой строки все тесты терпят неудачу с присваиванием, равным nil вместо ожидаемого значения. Я только случайно обнаружил, что когда я помещал некоторые операторы put, чтобы увидеть, был ли current_user устанавливается правильно.)
То, что он действует, так это то, что фиктивный оператор каким-то образом "заставляет" current_user быть загруженным, обновленным или распознанным.
Может кто-нибудь объяснить, что происходит, и что я должен делать по-другому, чтобы мне не понадобилось пустышка?
#specs/controllers/brokers_controller_spec.rb
describe BrokersController do
login_admin
def valid_attributes
{:name => "Bill", :email => "rspec_broker@example.com", :company => "Example Inc", :community_id => 1}
end
def valid_session
{}
end
describe "GET index" do
it "assigns all brokers as @brokers" do
dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE!
broker = Broker.create! valid_attributes
get :index, {}, valid_session
assigns(:brokers).should eq([broker])
end
end
describe "GET show" do
it "assigns the requested broker as @broker" do
dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE!
broker = Broker.create! valid_attributes
get :show, {:id => broker.to_param}, valid_session
assigns(:broker).should eq(broker)
end
end
и в соответствии с разработанной вики вот как я могу войти в систему: пользователь или: администратор
#spec/support/controller_macros.rb
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in Factory.create(:admin) # Using factory girl as an example
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = Factory.create(:user)
user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
sign_in user
end
end
end
3 ответа
Какая борьба! Спасибо, Робин, я часами гуглял по этому вопросу и наконец увидел твой пост; сейчас тесты моего контроллера работают:)
Чтобы добавить к вашему ответу, я выяснил, как включить сессию devis в хеш valid_session, который позволяет тестам контроллера работать должным образом, как это генерируется rails.
def valid_session
{"warden.user.user.key" => session["warden.user.user.key"]}
end
В ваших тестах есть следующий код:
def valid_session
{}
end
...
get :index, {}, valid_session
Из-за этой переменной 'session' 'log_in', который вы сделали, по существу не используется во время 'get'.
Я решил это путем удаления всех аргументов "valid_session" для вызовов get, post, put, delete в спецификации этого контроллера. Пример выше становится:
get :index, {}
Я подозреваю, что есть способ добавить сеанс устройства в хеш "valid_session", но я не знаю, что это такое.
Спасибо за это решение.
Если вы используете другую модель Devise, идентификатор сессии также изменится.
Для администратора модели используйте следующее:
def valid_session
{'warden.user.administrator.key' => session['warden.user.administrator.key']}
end