【问题标题】:Rails ActionController parameters ErrorRails ActionController 参数错误
【发布时间】:2016-07-27 07:20:41
【问题描述】:

这是我在 users_controller.rb 中的创建方法

def create
@user = User.new(user_params)

respond_to do |format|
  if @user.save
    format.html { redirect_to users_url, notice: 'User was successfully created.' }
    format.json { render :show, status: :created, location: @user }
  else
    format.html { render :new }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
end
end 

private
  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:name, :password, :password_confirmation)
  end

结束

这是我的 Users_controllers_spec.rb 文件

 require 'rails_helper'

 RSpec.describe UsersController, type: :controller do

  describe "Post /create" do
   let(:user){build(:user)}
   it "should create user" do
     expect(User).to receive(:new).with({name: 'Naik', password: 'secret', password_confirmation: 'secret'}).and_return(User)
    post :create,  user: {name: 'Naik', password: 'secret', password_confirmation: 'secret'}
    expect(flash[:success]).to eq("User was successfully created.")
    expect(response).to redirect_to(users_path)
   end
  end
end 

这是我得到的错误。我错过了什么吗?我是 Rspec 测试的新手,所以任何关于如何解决它的建议都将不胜感激。

谢谢。

【问题讨论】:

  • 不确定但试试这个:expect(User).to receive(:new).with({name: 'Naik', password: 'secret', password_confirmation: 'secret'}.with_indifferent_access)
  • 你应该试试params = ActionController::Parameters.new( {name: 'Naik', password: 'secret', password_confirmation: 'secret'}) user_params = UsersController::UserParams.build(params) expect(user_params).to eq({name: 'Naik', password: 'secret', password_confirmation: 'secret'}.with_indifferent_access)
  • 我试过了,没用。
  • 试着说expect(User).to receive(:new).with({name: 'Naik', password: 'secret', password_confirmation: 'secret'}).and_return(user) 一些例子可以在这里找到,这绝对是工作github.com/learnable-content/RSpec-collection/blob/…

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


【解决方案1】:

您可以在ActionController::Parameters 上执行to_h。然后所有允许的参数都将在该哈希中:

params = ActionController::Parameters.new({
  name: 'Senjougahara Hitagi',
  oddity: 'Heavy stone crab'
})
params.to_h # => {}

safe_params = params.permit(:name)
safe_params.to_h # => { name: 'Senjougahara Hitagi' }

我不是 rspec 专业人士,但我认为你可以做到:

expect(controller.params.to_h).to be({...})

【讨论】:

    【解决方案2】:

    这似乎是仅在使用 Rails 5 时才会出现的问题。以下是解决此问题的方法:How to expect a Params hash in RSpec in Rails 5?

    基本上应该是这样的:

    expect(User).to receive(:new).with(ActionController::Parameters.new( name: 'Naik', password: 'secret',password_confirmation: 'secret').permit(:name, :password, :password_confirmation)).and_return(user)
    expect(user).to receive(:save).and_return(true) # stub the `save` method
    post :create,  user: {name: 'Naik', password: 'secret', password_confirmation: 'secret'}
    # ...and then your expectations
    

    【讨论】:

    • 注意and_return(user),而不是and_return(User) - 在后一种情况下,您获得的不是类的实例,而是类本身。
    • 1) UsersController Post /create 应该创建用户失败/错误: let(:user){build(:user)} NoMethodError: undefined method build' for #<RSpec::ExampleGroups::UsersController::PostCreate:0x007fb74b5dc820> # ./spec/controllers/users_controller_spec.rb:18:in block (3 levels) in ' # ./spec/controllers/users_controller_spec.rb:21:in `block (3 levels) in '
    • 看起来您在使用 FactoryGirl 时遇到了一些问题,那是完全不同的故事。要查找示例配置,您可以参考github.com/learnable-content/RSpec-collection/blob/features/…
    猜你喜欢
    • 2015-11-23
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多