2010-01-12 8 views
31

Sto provando a verificare che una nuova azione nel mio controller RESTful abbia impostato una variabile di istanza del tipo di oggetto richiesto. Sembra abbastanza tipico, ma avendo difficoltà eseguendoloCome verificare la variabile di istanza è stata istanziata nel controller con RSpec

controller client

def new 
    @client = Client.new 
end 

prova

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 

Risultati in ...

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

Ciò è probabilmente dovuto al fatto che sta tentando di confrontare 2 istanze di record attivo, che differiscono. Quindi, come faccio a verificare che il controller configuri una variabile di istanza che contiene una nuova istanza del modello Client.

risposta

33

technicalpickles in #rspec mi hanno aiutato ...

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

Che ne dici se sto lavorando con un REST e non uso "@" nei controller? C'è una soluzione? Grazie – Luccas

+2

Non funziona per binari 5. Idiotico ... – asiniy

+3

Per rotaie 5, usa 'expect (assegna (: client). A be_a (Client)' – heyitsjhu

13

È possibile utilizzare new_record Rails'? metodo per controllare se una determinata istanza è stato salvato nel database già oppure no:

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

(Non è possibile utilizzare cessionari [: client] per ragioni storiche, in base a: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)

+0

Il link a "four-hashes-of-the-apocalypse" spiega tutto ciò che un dev di Rails deve sapere sulle viste dell'ambiente ricevute dai controllori! – Epigene

9

Per questo 2016 RSpec uso della sintassi v3:

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

Inoltre, per gli altri che potrebbero fermarsi qui a causa del titolo della domanda, qui è come verificare se un'istanza variabile @client è stata impostata su qualsiasi

# in controller action 
@client = Client.find_by(name: "John") 

# spec assignment based on collection membership 

expect(assigns.keys).to include('client') 

Vedere @Attila Györffy's answer sul motivo per cui è necessario l'accesso all'hash hash con chiavi stringa.

Problemi correlati