代码之家  ›  专栏  ›  技术社区  ›  dimitry_n

控制器规范#显示操作:exected:[Object],得到:nil错误-RSpec 3

  •  0
  • dimitry_n  · 技术社区  · 11 年前

    我正在阅读Aaron Sumner的《RSpec日常轨道测试》(3)一书,无法通过以下步骤:

    我正试图找出一个 users#show 操作:

    用户_控制器规范:

    ...    
    describe 'GET #show' do
    
      it "assigns the requested contact to @user" do
        user = create(:user)
        get :show, id: user.id
        expect(assigns(:user)).to eq user
      end
    
    
      it "renders the :show template" do
        user = create(:user)
        get :show, id: user.id
        expect(response).to render_template :show
      end
    
    end
    ...
    

    用户_控制器:

    class UsersController < ApplicationController
      before_action :authenticate
      before_action :set_user, only: [:show]
    
      ### Read:
      def show
        ...
      end
    
    
      private
    
      def set_user
        @user = User.find(params[:id])
      end
    
    end
    

    application_controller助手:

      def authenticate
        redirect_to home_path, alert: 'Please log in first' if current_user.nil?
      end
    
      private 
    
      def current_user
        @current_user ||= User.find(session[:user_id]) if session[:user_id]
      end
    
      helper_method :current_user
    

    错误:

    Failures:
    
      1) UsersController GET #show assigns the requested user to @user
         Failure/Error: expect(assigns(:user)).to eq user
    
           expected: #<User id: 1, ...">
                got: nil
    
           (compared using ==)
         # ./spec/controllers/users_controller_spec.rb:10:in `block (3 levels) in <top (required)>'
    
      2) UsersController GET #show renders the :show template
         Failure/Error: expect(response).to render_template :show
           expecting <"show"> but rendering with <[]>
         # ./spec/controllers/users_controller_spec.rb:17:in `block (3 levels) in <top (required)>'
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   ptd    11 年前

    您的问题来自 before_action :authenticate 您需要将自己设置为规范中的身份验证,或者需要跳过 show 行动

    您通常会进行如下测试:

    context 'when logged in' do
      before(:each) do
        set_as_logged_in
      end
    
      # your specs
    end
    

    其中 set_as_logged_in 方法将根据您的身份验证方式而不同。那么你也可以 'when not logged in' 上下文,以验证未登录时操作的行为是否符合预期。