2016-07-27 23 views
2

Dies ist meine create-Methode in users_controller.rbRails Action Parameter Fehler

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 

Ende

Und das ist meine Users_controllers_spec.rb Datei

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 

Und das ist der Fehler, den ich bin bekommen. Fehle ich etwas? Ich bin neu in der Rspec-Prüfung, daher wäre jeder Rat zur Lösung zu schätzen.

Anyone has faced this error before ?

Danke.

+0

nicht sicher, aber versuchen Sie dies: ist, wie diese behoben werden können 'erwarten (User) .zu empfangen (: neu) .with ({name: 'Naik', passwort: 'secret', password_confirmation: 'secret'}. With_indifferent_access) ' – Deep

+0

sollte man versuchen' params = ActionController :: Parameters.new ( {name: 'Naik', Passwort: 'geheim', password_confirmation: 'secret'}) user_params = BenutzerController :: UserParams.build (params) expect (user_params) .to eq ({Name: 'Naik', Passwort : 'secret', password_confirmation: 'secret'}. with_indifferent_access) ' –

+0

Ich habe versucht, dass es nicht funktioniert hat. –

Antwort

1

Dies scheint nur ein Problem zu sein, wenn Rails 5. Hier How to expect a Params hash in RSpec in Rails 5?

Grundsätzlich sollte dies sein:

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

Beachten Sie die 'and_return (user)', nicht 'and_return (User)' - im letzteren Fall erhalten Sie keine Instanz der Klasse, sondern die Klasse selbst. – bodrovis

+0

1) Userscontroller Pfosten-/erstellen sollten Benutzer Ausfall/Fehler erstellen: lassen (: user) {bauen (: user)} NoMethodError: nicht definierte Methode 'build‘ für # # ./spec/controllers/users_controller_spec.rb:18:in 'block (3 levels) in ' # ./spec/controllers/users_controller_spec.rb:21:in' block (3 Ebenen) in ' –

+0

Dies ist der Fehler, den ich einmal mein Code aktualisiert habe –

2

Sie können to_h über die ActionController::Parameters tun. Dann werden alle zulässigen Parameter werden in diesem Hash sein:

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' } 

ich kein rspec pro bin, aber ich denke, Sie tun können:

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

Hey Hallo Wo verwende ich den folgenden Code? –

+0

(bearbeitet die Frage) – siegy22

+0

Hallo Ich habe das versucht, aber nicht funktioniert –