Rails ActionController 参数错误

4
这是我在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测试的新手,如果能给出解决方法,将不胜感激。 Anyone has faced this error before ? 谢谢。

不确定但可以尝试这样写:expect(User).to receive(:new).with({name: 'Naik', password: 'secret', password_confirmation: 'secret'}.with_indifferent_access) - Deepesh
你应该尝试使用以下代码: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) - Rajarshi Das
我尝试过它们,但没有起作用。 - Pratik Naik
尝试说“expect(User).to receive(:new).with({name: 'Naik', password: 'secret', password_confirmation: 'secret'}).and_return(user)”这里可以找到一些例子,而且这肯定曾经是有效的 https://github.com/learnable-content/RSpec-collection/blob/controller_testing/spec/controllers/albums_controller_spec.rb#L3 - Ilya Bodrov-Krukowski
2个回答

2
您可以在 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({...})

1
这似乎只是在使用Rails 5时出现的问题。以下是如何解决该问题: 如何在Rails 5中使用RSpec来期望Params哈希? 基本上应该是这样的:
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) - 在后一种情况下,您得到的不是类的实例,而是类本身。 - Ilya Bodrov-Krukowski
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 <top (required)>'

./spec/controllers/users_controller_spec.rb:21:in `block (3 levels) in <top (required)>'

- Pratik Naik
似乎你在使用FactoryGirl时遇到了一些问题,这是一个完全不同的故事。如果想找到示例配置,可以参考https://github.com/learnable-content/RSpec-collection/blob/features/spec/support/factory_girl.rb。 - Ilya Bodrov-Krukowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接