2010-01-12 25 views
31

Estoy tratando de verificar que una nueva acción en mi controlador RESTful configure una variable de instancia del tipo de objeto requerido. Parece bastante típico, pero tiene problemas para ejecutarloCómo se prueba la instancia de la variable de instancia en el controlador con RSpec

controlador de cliente

def new 
    @client = Client.new 
end 

prueba

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 

Resultados en ...

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

Probablemente porque está tratando de comparar 2 instancias de registro activo, que difieren. Entonces, ¿cómo puedo verificar que el controlador configure una variable de instancia que contenga una nueva instancia del modelo de Cliente?

Respuesta

33

technicalpickles en #rspec me ayudaron ...

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

¿Qué tal si estoy trabajando con un REST y no uso "@" en los controladores? ¿Hay alguna solución? Gracias – Luccas

+2

No funciona para rieles 5. Idiota ... – asiniy

+3

Para rieles 5, use 'expect (asigna (: cliente) .to be_a (Cliente)' – heyitsjhu

13

Puede utilizar new_record Rails? Método para comprobar si un caso dado se ha guardado en la base de datos ya o no:

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

(No se puede utilizar cesionarios [cliente]: por razones históricas, de acuerdo con: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)

+0

el enlace a "cuatro hashes del apocalipsis" explica todo lo que un desarrollador de Rails necesita saber sobre las vistas del entorno recibidas de los controladores. – Epigene

9

Por esa 2016 RSpec uso de sintaxis v3:

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

también, para otros que pueden dejar aquí por el título de la pregunta, aquí es cómo probar si una variable de instancia @client poseía ningún

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

# spec assignment based on collection membership 

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

Consulte @Attila Györffy's answer sobre por qué se debe acceder al hash de asignaciones con las teclas de cadena.

Cuestiones relacionadas