2012-10-23 6 views
7

Ich habe die folgende Route:Devise Rspec Registrierung Controller Test auf Update versagt, als ob es versucht, E-Mail-Adresse zu bestätigen

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks", 
            :registrations => 'users/registrations', 
            :sessions => "users/sessions" } 

und den folgenden Controller-Test (registrations_controller_spec.rb):

require File.dirname(__FILE__) + '/../spec_helper' 

describe Users::RegistrationsController do 
    include Devise::TestHelpers 
    fixtures :all 
    render_views 

    before(:each) do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    end 

    describe "POST 'create'" do 

    describe "success" do 
     before(:each) do 
     @attr = { :email => "[email protected]", 
        :password => "foobar01", :password_confirmation => "foobar01", :display_name => "New User" } 
     end 

     it "should create a user" do 
     lambda do 
      post :create, :user => @attr 
      response.should redirect_to(root_path) 
     end.should change(User, :count).by(1) 
     end 

    end 

    end 

    describe "PUT 'update'" do 
    before(:each) do 
     @user = FactoryGirl.create(:user) 
     @user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module 
     sign_in @user 
    end 

    describe "Success" do 

     it "should change the user's display name" do 
     @attr = { :email => @user.email, :display_name => "Test", :current_password => @user.password } 
     put :update, :id => @user, :user => @attr 
     puts @user.errors.messages 
     @user.display_name.should == @attr[:display_name] 
     end 

    end 
    end 

end 

Nun, wenn ich rspec spec laufen lasse, bekomme ich (was ich denke) seltsame Ergebnisse:

Der "sollte einen Benutzer erstellen" Test besteht. Die Benutzeranzahl von 1.

jedoch zugenommen hat, meine „sollte den Anzeigenamen des Benutzers ändern“ schlägt fehl, wie folgt:

1) Users::RegistrationsController PUT 'update' Success should change the user's display name 
    Failure/Error: @user.display_name.should == @attr[:display_name] 
     expected: "Test" 
      got: "Boyd" (using ==) 

Und das seltsame Bit ist, dass meine Aussage:

puts @user.errors.messages 

Rendert die folgende Meldung:

{:email=>["was already confirmed, please try signing in"]} 

Was ist los? Der Benutzer ist angemeldet! Dies wird durch die Tatsache bewiesen, dass der Rspec-Fehler den Anzeigename von "Boyd" zurückgegeben hat. Und warum wird eine Nachricht so angezeigt, als ob sie mit der Bestätigung des Kontos im Gegensatz zur Aktualisierung der Daten eines Benutzers zusammenhängt?

Jede Hilfe würde sehr geschätzt werden!

+0

Ich bin sicher, der Name wird von der Fabrik abgeholt und nicht unbedingt ein Login-Prozess. Hilft dir das überhaupt? Http://stackoverflow.com/questions/4230152/mocks-arent-working-with-rspec-and-devise – holtkampw

+0

Ja, du hast Recht !!! Das Holz nicht für die Bäume sehen! Habe @user durch subject.current_user im Test ersetzt und alles funktioniert. Vielen Dank! – HapiDaze

Antwort

1

Das funktioniert. Danke holtkampw für das Sehen, was ich nicht war! Ich gebe ein paar extra Code hinein, nur um zu überprüfen, und alles ist gut!

it "should change the user's display name" do 
    subject.current_user.should_not be_nil 
    @attr = { :email => @user.email, :display_name => "Test", :current_password => @user.password } 
    puts "Old display name: " + subject.current_user.display_name 
    put :update, :id => subject.current_user, :user => @attr 
    subject.current_user.reload 
    response.should redirect_to(root_path) 
    subject.current_user.display_name == @attr[:display_name] 
    puts "New display name: " + subject.current_user.display_name 
end