2010-01-12 9 views
31

Ich versuche zu überprüfen, dass eine neue Aktion in meinem RESTful-Controller eine Instanzvariable des erforderlichen Objekttyps einrichten. Scheint ziemlich typisch, aber Schwierigkeiten Ausführung es mitSo testen Sie Instanzvariable wurde in Controller mit RSpec instanziiert

Client-Controller

def new 
    @client = Client.new 
end 

-Test

describe "GET 'new'" do 
    it "should be successful" do 
    get 'new' 
    response.should be_success 
    end 

    it "should create a new client" do 
    get 'new' 
    assigns(:client).should == Client.new 
    end 
end 

Ergebnisse in ...

 
'ClientsController GET 'new' should create a new client' FAILED 
    expected: #, 
     got: # (using ==) 

Das ist wahrscheinlich, weil es versucht, 2 Instanzen des aktiven Datensatzes zu vergleichen, die sich unterscheiden. Wie kann ich überprüfen, ob der Controller eine Instanzvariable eingerichtet hat, die eine neue Instanz des Clientmodells enthält?

Antwort

33

technicalpickles in #rspec half mir aus ...

assigns(:client).should be_kind_of(Client) 
+0

Wie wäre es, wenn ich mit einem REST arbeite und ich nicht "@" in den Controllern verwende? Gibt es eine Problemumgehung? Danke – Luccas

+2

Funktioniert nicht für Schienen 5. Idiotische ... – asiniy

+3

Verwenden Sie für Schienen 5 'expect (weist (: Client) .to be_a (Client)' – heyitsjhu

13

Sie Rails new_record verwenden kann? Verfahren zu überprüfen, ob eine bestimmte Instanz in die Datenbank bereits oder nicht gespeichert:

assigns(:client).should be_a(Client) 
assigns(:client).should be_new_record 

(Sie können nicht verwenden Abtretungsempfänger [: client] aus historischen Gründen nach: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse) Für die

+0

Link zu "Vier-Hashe-of-the-Apocalypse" erklärt alles, was ein Rails-Entwickler über die Umgebungsansichten von Controllern wissen muss! – Epigene

9

2016 RSpec v3 Syntax:

expect(assigns(:client)).to be_a(Client) 

auch für andere, die wegen der Frage Titel hier aufhören kann, ist hier, wie zu testen, ob eine Instanz Variable @client auf alles eingestellt wurde

Siehe @Attila Györffy's answer darüber, warum der Assign-Hash muss mit String-Schlüssel zugegriffen werden.