Как заглушить часть сеанса для имитации авторизованного сеанса?


У меня есть фильтр 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 3

1 ответ:

Учитывая, что вы тестируете контроллер и пытаетесь сфокусировать его на контроллере, вы можете заглушить метод current_user реальным пользователем или макетом.

before(:each) do
   ApplicationController.any_instance.stub(:current_user).and_return(@user = mock('user'))
end

С этим у вас будет доступ к макету user, чтобы применить дальнейшие ожидания и заглушки, если это необходимо. Если макет встает на пути, измените его на реальный объект User.