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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top