Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 控制器规格#显示操作:exocted:[对象],获取:nil错误-RSpec 3_Ruby On Rails_Ruby_Testing_Rspec_Tdd - Fatal编程技术网

Ruby on rails 控制器规格#显示操作:exocted:[对象],获取:nil错误-RSpec 3

Ruby on rails 控制器规格#显示操作:exocted:[对象],获取:nil错误-RSpec 3,ruby-on-rails,ruby,testing,rspec,tdd,Ruby On Rails,Ruby,Testing,Rspec,Tdd,我正在阅读Aaron Sumner的《RSpec(3)日常Rails测试》一书,但无法通过以下步骤: 我正在尝试指定一个用户#show操作,包括: 用户\u控制器\u规格: ... describe 'GET #show' do it "assigns the requested contact to @user" do user = create(:user) get :show, id: user.id expect(assigns(:user)).to

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

我正在尝试指定一个
用户#show
操作,包括:

用户\u控制器\u规格:

...    
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
  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
用户\u控制器:

...    
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
  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) UsersController GET#show将请求的用户分配给@user
失败/错误:expect(分配(:用户))给eq用户

预期:#您的问题来自于_操作之前的
:验证
您需要在规范中将自己设置为已验证,或者需要跳过
显示
操作的验证

您通常会进行如下测试:

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

  # your specs
end

其中,
set_as_logged_in
方法会根据您的身份验证方式而有所不同。然后,您还可以使用
“未登录时”
上下文来验证未登录时操作的行为是否符合预期。

\是否应将其更改为user.id?--我想是的。1)
expected[object]得到零
2)
expected(response)。要渲染模板:显示但使用
渲染。我在操作手册中列出的两个错误可能是您的#show action为空。。这就是为什么!我还使用了本地变量而不是实例变量(
user
vs
@user
)。谢谢