In meiner Rails 4 app Ich habe diese update
Aktion:Wie kann ich update_attributes Funktion in Rails mit RSpec testen?
class UsersController < ApplicationController
...
def update
current_email = @user.email
new_email = user_params[:email].downcase
if @user.update_attributes(user_params)
if current_email != new_email
@user.email = current_email
@user.new_email = new_email.downcase
@user.send_email_confirmation_email
flash[:success] = "Please click the link we've just sent you to confirm your new email address."
else
flash[:success] = "User updated."
end
redirect_to edit_user_path(@user)
else
render :edit
end
end
...
end
Es macht im Grunde sicher, dass ein user
kann einfach keine neue E-Mail-Adresse speichern. Er muss dies zuerst bestätigen, indem er auf einen Link in einer E-Mail klickt, die wir an ihn senden.
Das funktioniert gut, aber aus irgendeinem Grund habe ich keine Möglichkeit gefunden, es zu testen.
Die folgende RSpec Test hält versagt, egal, was ich tue:
it "changes the user's new_email attribute" do
@user = FactoryGirl.create(:user, :email => "[email protected]")
patch :update, :id => @user, :user => FactoryGirl.attributes_for(:user, :email => "[email protected]")
expect(@user.reload.new_email).to eq("[email protected]")
end
@user.new_email
ist immer nil
und der Test nicht bestanden immer. Was fehlt mir hier?
Re-Factoring meiner update
Aktion wäre überhaupt kein Problem. Vielleicht gibt es einen besseren Weg? Danke für jede Hilfe.
Danke! Das sieht sehr vielversprechend aus und viel besser als mein ursprünglicher Code! Leider habe ich "undefinierte Methode" geändert? für "": String' in meinem Controller in Zeile 'if @ user.new_email.changed?'. Ich habe deinen Code Wort für Wort kopiert. Was vermisse ich? – Tintin81
Ich habe schon verschiedene Dinge ausprobiert, habe manuell auch das 'ActiveModel :: Dirty' eingebaut, aber ohne Erfolg. Ich benutze Rails 4.2.8. – Tintin81
Oh Ups sollte .new_email_changed sein? – max