ruby - que - Cómo probar la variable de instancia se instancia en el controlador con RSpec
que es una instancia en ruby (3)
Estoy intentando verificar que una nueva acción en mi controlador RESTful establezca una variable de instancia del tipo de objeto requerido. Parece bastante típico, pero tiene problemas para ejecutarlo
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 ==)
Lo cual es 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?
Para el uso de la sintaxis RSpec v3 2016:
expect(assigns(:client)).to be_a(Client)
Además, para otros que pueden detenerse aquí debido al título de la pregunta, aquí se muestra cómo probar si una variable de instancia @client
se configuró en cualquier elemento.
# in controller action
@client = Client.find_by(name: "John")
# spec assignment based on collection membership
expect(assigns.keys).to include(''client'')
Consulte la respuesta de @Attila Györffy sobre por qué se debe acceder al hash de asignaciones con las teclas de cadena.
Puedes usar new_record de Rails? método para verificar si una instancia determinada ya se ha guardado en la base de datos o no:
assigns(:client).should be_a(Client)
assigns(:client).should be_new_record
(No puede usar asignaciones [: cliente] por razones históricas, de acuerdo con: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse )
technicalpickles en #rspec me ayudó ...
assigns(:client).should be_kind_of(Client)