RSpec en el controlador y Stubbing
-
02-10-2019 - |
Pregunta
estoy bastante familiarizado con el uso rspec y estoy tratando de escribir mis pruebas para mis controladores. Tengo este controlador (estoy usando Mocha para stubbing):
class CardsController < ApplicationController
before_filter :require_user
def show
@cardset = current_user.cardsets.find_by_id(params[:cardset_id])
if @cardset.nil?
flash[:notice] = "That card doesn't exist. Try again."
redirect_to(cardsets_path)
else
@card = @cardset.cards.find_by_id(params[:id])
end
end
end
Estoy intentando probar esta acción con algo como esto:
describe CardsController, "for a logged in user" do
before(:each) do
@cardset = Factory(:cardset)
profile = @cardset.profile
controller.stub!(:current_user).and_return(profile)
end
context "and created card" do
before(:each) do
@card = Factory(:card)
end
context "with get to show" do
before(:each) do
get :show, :cardset_id => @cardset.id, :id => @card.id
end
context "with valid cardset" do
before(:each) do
Cardset.any_instance.stubs(:find).returns(@cardset)
end
it "should assign card" do
assigns[:card].should_not be_nil
end
it "should assign cardset" do
assigns[:cardset].should_not be_nil
end
end
end
end
end
El "debería asignar cardset" pasa la prueba, pero no puedo encontrar la manera de stub adecuadamente este @card = @cardset.cards.find_by_id(params[:id])
línea para la prueba "debe asignar a la tarjeta". ¿Cuál es la mejor manera de poner a prueba esta acción, o si estoy en el camino correcto ¿cómo podría adecuadamente stub mis llamadas modelo?
Solución 2
Los talones que terminé buscando donde éstos
Cardset.stubs(:find_by_id).returns(@cardset)
@cardset.cards.stubs(:find_by_id).returns(@card)
Otros consejos
Ok, elimina una respuesta anterior, que estaba equivocado.
primero: se le Stubbing find
no find_by_id
. A pesar de que no es necesario utilizar find_by_id ya que es el valor predeterminado para hallazgo. Por lo tanto el uso find
En segundo lugar: el ordenamiento before :each
va a llamar a la get :show
antes de que el trozo que Cardset
En tercer lugar: comprobar su test.log y asegúrese de que no está recibiendo redireccionado. Su acción require_user
podría causar una redirección antes current_user
está aún establecido.
class CardsController < ApplicationController
...
@card = @cardset.cards.find(params[:id])
...
end
describe CardsController, "for a logged in user" do
before(:each) do
@cardset = Factory(:cardset)
profile = @cardset.profile
controller.stub!(:current_user).and_return(profile)
end
context "and created card" do
before(:each) do
@card = Factory(:card)
end
context "with get to show" do
context "with valid cardset" do
before(:each) do
Cardset.any_instance.stubs(:find).returns(@cardset)
get :show, :cardset_id => @cardset.id, :id => @card.id
end
it "should assign card" do
assigns[:card].should_not be_nil
end
it "should assign cardset" do
assigns[:cardset].should_not be_nil
end
end
end
end
end