2016-07-27 56 views
2

這是我在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測試新手,所以如何解決它的任何建議,將不勝感激。

Anyone has faced this error before ?

謝謝。

+0

不知道,但嘗試這個辦法:'期待(用戶).to接收(:new).with({name:'Naik',password:'secret',password_confirmation:'secret'}。with_indifferent_access)' – Deep

+0

你應該嘗試'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)' –

+0

我試過他們沒有工作。 –

回答

1

這似乎是使用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 
+0

注意''和_return(user)',而不是'and_return(User)' - 在後一種情況下,您不會得到類的實例,而是類本身。 – bodrovis

+0

1)UsersController郵政/創建應該創建用戶 故障/錯誤:讓(:用戶){建立(:用戶)} NoMethodError: 未定義的方法'構建」爲# #./spec/controllers/users_controller_spec.rb:18:in ' #./spec/controllers/users_controller_spec.rb:21:in'block( 3級)在<頂部(必填)>' –

+0

這是我得到一次更新我的代碼的錯誤 –

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({...}) 
+0

嗨嗨我在哪裏使用下面的代碼? –

+0

(編輯問題) – siegy22

+0

嗨我試過這個但不工作 –

相關問題