2016-12-05 5 views
0

Ich versuche, den sust_create_taption Block zu testen. Hier ist der Code: appointments_controller_test.rbcontroller_test: NoMethodError: undefinierte Methode `Erlaubnis 'für # <Array: 0x98583f0>

..... 
test "should create appointment" do 
    login_as(@heiko) 
    @heiko.confirmed_at = Time.now 

    assert_difference('Appointment.count') do 
     post appointments_url, params: { appointment: [@heikoAppointment.attributes, @heikoInvitation.user_id, @heikoInvitation.message] } 
    end 

    assert_redirected_to appointment_url(Appointment.last) 
    end 
... 

Controller/appointments_controller.rb

def appointment_params 
    params.require(:appointment).permit(:shopper_id, :status, :appointed, :processed, :shopping_list_id, invitation_attributes: [:user_id, :message ]) 
end 

Jedoch, wenn ich den Test ausführen, bekomme ich diesen Fehler in should_create_appointment:

AppointmentsControllerTest#test_should_create_appointment: 
NoMethodError: undefined method `permit' for #<Array:0x98583f0> 
    app/controllers/appointments_controller.rb:141:in `appointment_params' 
    test/controllers/appointments_controller_test.rb:31:in `block (2 levels) in <class:AppointmentsControllerTest>' 
    test/controllers/appointments_controller_test.rb:30:in `block in <class:AppointmentsControllerTest>' 

Weiß jemand, was schief gelaufen ist? Hier sind die Armaturen:

appointments.yml

appointment_heiko: 
user: user_heiko 
appointed: <%= Time.now + 2.weeks %> 
processed: <%= Time.now - 1.weeks %> 
shopping_list: shopping_list_lebensmittel 
shopper: user_shopper 
status: <%= Appointment.statuses[:finished] %> 

invitations.yml

invitation_heiko: 
user: user_heiko 
shopping_list: shopping_list_drogerie 
appointment: appointment_heiko 
accepted: true 
responded: <%= Time.now - 3.weeks %> 
message: 'Gerne akzeptiere ich die Einladung' 

Antwort

2

Das Problem in der Art und Weise ist bist du params zur post Anfrage in der Weitergabe Prüfung. Im params-Hash gibt es zwei Schlüssel appointment und invitation_attributes, die nicht action, controller sind, und formularbasierte Entitäten wie authenticity token und encoding. Wenn der Test ausgeführt wird, gibt params.require(:appointment) ein Array zurück. permit ist eine Methode, die auf hashes funktioniert und nicht arrays. Dies besagt eindeutig, dass params[:appointment] eine hash sein sollte.

post appointments_url, params: { appointment: @heikoAppointment.attributes, invitation_attributes: { user_id: @heikoInvitation.user_id, message: @heikoInvitation.message } } 

tatsächlich zu sehen, was in vergangen params bekommen, Ihre create Aktion mit folgenden ersetzen.

def create 
    render text: appointment_params 
end 

Nun, wenn Sie versuchen, durch Absenden des Formulars eine neue Einheit zu erstellen, werden Sie die params als Klartext vom Server gesendet finden. Dies sollte eine Vorstellung davon geben, was im params Hash passiert.

+0

danke für erklärung, es funktioniert gut! Wissen Sie auch, wie Sie die Löschfunktion testen können? Ich benutze dies: delete termination_url (@heikoAppointment), aber dann erscheint der Fehler: Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl – Peter

Verwandte Themen