我有一个before_action
过滤器,想要测试只有在用户登录时才执行索引操作。简单地说,我不知道如何执行此操作。我使用自己的简单身份验证,我知道我可以使用CanCan或类似的,但是对于我自己的学习,我很难做到这一点!
ApplicationController.rb
helper_method :logged_in
helper_method :current_user
def current_user
@current_user ||= User.find_by_id(session[:current_user]) if session[:current_user]
end
def logged_in
unless current_user
redirect_to root_path
end
end
ActivitiesController.rb
before_action :logged_in
def index
@activities = Activity.all.where(user_id: @current_user)
end
Activities_Controller_spec.rb
require 'rails_helper'
RSpec.describe ActivitiesController, :type => :controller do
describe "GET index" do
before(:each) do
@activity = FactoryGirl.create(:activity)
session[:current_user] = @activity.user_id
@current_user = User.find_by_id(session[:current_user]) if session[:current_user]
end
it "shows all activities for signed in user" do
get :index, {user_id: @activity.user_id}
expect(response).to redirect_to user_activities_path
end
end
end
activities.rb(工厂)
FactoryGirl.define do
factory :activity do
association :user
title { Faker::App.name }
activity_begin { Faker::Date.forward(10) }
activity_end { Faker::Date.forward(24) }
end
end
我收到以下错误:
Failure/Error: expect(response).to redirect_to user_activities_path
Expected response to be a redirect to <http://test.host/users/1/activities> but was a redirect to <http://test.host/>.
Expected "http://test.host/users/1/activities" to be === "http://test.host/".
答案 0 :(得分:1)
经过长时间的讨论,我认为测试应该是这样的(它没有经过测试:))
require 'rails_helper'
RSpec.describe ActivitiesController, :type => :controller do
describe "GET index" do
before(:each) do
@activity = FactoryGirl.create(:activity)
end
context 'when user is logged' do
before(:each) do
session[:current_user] = @activity.user_id
end
it "shows all activities for signed in user" do
get :index, {user_id: @activity.user_id}
expect(response).to be_success
end
end
context 'when user is anonymous' do
it "redirects user to root path" do
get :index, {user_id: @activity.user_id}
expect(response).to redirect_to root_path
end
end
end
end