Rails的ActionController的参数错误
这是我在users_controller.rb创建方法Rails的ActionController的参数错误
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测试新手,所以如何解决它的任何建议,将不胜感激。
谢谢。
这似乎是使用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
注意''和_return(user)',而不是'and_return(User)' - 在后一种情况下,您不会得到类的实例,而是类本身。 – bodrovis
1)UsersController邮政/创建应该创建用户 故障/错误:让(:用户){建立(:用户)} NoMethodError: 未定义的方法'构建”为#
这是我得到一次更新我的代码的错误 –
您可以在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({...})
不知道,但尝试这个办法:'期待(用户).to接收(:new).with({name:'Naik',password:'secret',password_confirmation:'secret'}。with_indifferent_access)' – Deep
你应该尝试'params = ActionController :: Parameters.new (user_params).to eq({name:'Naik',password){(name:'Naik',password:'secret',password_confirmation:'secret'}) user_params = UsersController :: UserParams.build(params) expect :'secret',password_confirmation:'secret'}。with_indifferent_access)' –
我试过他们没有工作。 –