Как заглушить часть сеанса для имитации авторизованного сеанса?
У меня есть фильтр before на моем контроллере продуктов:
before_filter :authorize, only: [:create, :edit, :update]
Мой authorize
метод определен в моем application_controller
следующим образом:
def authorize
redirect_to login_url, alert: "Not authorized" if current_user.nil?
end
И current_user определяется как:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
В моем rspec я пытаюсь:
before(:each) do
session.stub!(:user_id).and_return("admin@email.com")
end
Но я все еще получаю ошибку следующего вида:
ProductsController PUT update with valid params redirects to the product
Failure/Error: response.should redirect_to(product)
Expected response to be a redirect to <http://test.host/products/1> but was a redirect to <http://test.host/login>
. . . это означает, что мой тест не вошел в систему во время запроса.
Чего мне здесь не хватает?
Есть ли лучший способ подойти к этой ситуации?1 ответ:
Учитывая, что вы тестируете контроллер и пытаетесь сфокусировать его на контроллере, вы можете заглушить метод
current_user
реальным пользователем или макетом.before(:each) do ApplicationController.any_instance.stub(:current_user).and_return(@user = mock('user')) end
С этим у вас будет доступ к макету
user
, чтобы применить дальнейшие ожидания и заглушки, если это необходимо. Если макет встает на пути, измените его на реальный объектUser
.