【问题标题】:Controller Spec #Show Action: exoected: [Object], got: nil Error - RSpec 3Controller Spec #Show Action: exoected: [Object], got: nil Error - RSpec 3
【发布时间】:2015-02-18 16:54:55
【问题描述】:

我正在阅读 Aaron Sumner 的 Everyday Rails Testing with RSpec (3) 一书,但无法通过以下步骤:

我正在尝试通过以下方式指定 users#show 操作:

users_controller_spec:

...    
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
...

users_controller:

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)>'

【问题讨论】:

  • \这个应该改成user.id吗? -- 我觉得可以。
  • 1) expected [object] got nil 2) expect(response).to render_template :show but rendering with &lt;[]&gt;。我在 OP 中列出的两个错误
  • 可能是您的#show 操作为空。这就是原因

标签: ruby-on-rails ruby testing rspec tdd


【解决方案1】:

您的问题来自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' 上下文来验证您未登录时该操作的行为是否符合预期。

【讨论】:

  • 是的!我还使用了本地变量而不是实例变量(user@user)。谢谢!
猜你喜欢
  • 2012-11-18
  • 2012-07-17
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多