使用before_action过滤器的RSPEC测试索引操作

时间:2014-12-30 12:39:01

标签: ruby-on-rails ruby ruby-on-rails-4 rspec before-filter

我有一个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/".

1 个答案:

答案 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