Pregunta

Quiero llamar a un named_scope que sólo devolverá un registro, pero el named_scope devuelve una matriz, que no es un gran problema ya que sólo puede encadenar con .First:

Model.named_scope(param).first

y esto funciona, lo que estoy luchando con es cómo derivadas La llamada encadenada. ¿Alguien tiene una referencia o una respuesta sobre cómo iba a ir sobre la realización de este Rspec con burla?

¿Fue útil?

Solución

Me imaginé algo.

Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))

lo que me permite llamar a mi controlador:

@client = Client.named_scope(param).first

Funciona, pero no es una solución mejor?

EDIT:

La liberación de rspec 1.2.6 nos permite utilizar stub_chain lo que significa que ahora puede ser:

Client.stub_chain(:named_scope, :chained_call).and_return(@clients = [mock(Client)])

Esta era la parte superior de la cabeza, como siempre comprobar la API para obtener información específica:)

Otros consejos

Una mejor versión de

Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))

serán los siguientes:

Client.should_receive(:named_scope).with(param).and_return do
  record = mock_model(Comm)
  record.should_receive(:do_something_else)
  [record]  
end

La pregunta es bastante viejo y por lo tanto hay pocas mejoras en la forma en que se puede hacer tropezar. Ahora puede utilizar stub_chain método para stub una cadena de llamadas a métodos. Por ejemplo:

@client = Client.named_scope(param).first

puede ser aplastó con:

Client.stub_chain(:named_scope,:first).and_return(@client = mock(Client))

Más ejemplos de stub_chaining:

describe "stubbing a chain of methods" do
  subject { Object.new }

  context "given symbols representing methods" do
    it "returns the correct value" do
      subject.stub_chain(:one, :two, :three).and_return(:four)
      subject.one.two.three.should eq(:four)
    end
  end

  context "given a string of methods separated by dots" do
    it "returns the correct value" do
      subject.stub_chain("one.two.three").and_return(:four)
      subject.one.two.three.should eq(:four)
    end
  end
end

o por favor, eche un vistazo a:

Larga vida a los rspecs !!! :)

supongo que esto está en una especificación de controlador?

Su propia sugerencia debería funcionar bien. Otra posibilidad es mover la llamada named_scope dentro de su modelo, para evitar el problema por completo. Esto también estaría en línea con el "modelos gordas, delgadas controladores" consejo.

Creo que ya has hecho la cosa controlador delgada poniendo la consulta en un ámbito con nombre donde puede ser reutilizado. Aquí hay un código utilicé antes de empezar a usar los ámbitos mencionados.

  def mock_comm(stubs={})
    @mock_comm ||= mock_model(Comm, stubs)
  end

  describe "responding to GET index" do

    it "should expose all comms as @comms" do
      Comm.should_receive(:find).with(:all).and_return([mock_comm])
      get :index
      assigns[:comms].should == [mock_comm]
    end
# ...

Yo probablemente escribir código muy similar a lo que ya tiene, pero tal vez lo puso en un ayudante que me permite reutilizarlo. La otra cosa es utilizar un marco de burla diferente que a lo mejor le da más control. Echar un vistazo a Railscast Ryan Bates en RSpec - es un poco viejo ahora, pero todavía algunas buenas ideas de allí

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top