Domanda

Voglio chiamare un named_scope che restituirà un solo record, ma il named_scope restituisce un array, che non è un grosso problema, come posso solo concatenare con .first:

Model.named_scope(param).first

e questo funziona, quello che sto lottando con è come stub la chiamata incatenato. Qualcuno ha un riferimento o una risposta su come andrei circa realizzare questo con Rspec beffardo?

È stato utile?

Soluzione

ho capito qualcosa.

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

che mi permette di chiamare il mio controller:

@client = Client.named_scope(param).first

Funziona, ma c'è una soluzione migliore?

EDIT:

Il rilascio di RSpec 1.2.6 ci permette di utilizzare stub_chain che significa che ora può essere:

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

Questa è stata superiore della mia testa, come controllare sempre l'API per le specifiche:)

Altri suggerimenti

Una migliore versione di

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

sarà:

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

La domanda è piuttosto vecchio e quindi non ci sono alcuni miglioramenti nel modo in cui lo sradicamento può essere fatto. Ora è possibile utilizzare stub_chain metodo per stub una catena di chiamate di metodo. Ad esempio:

@client = Client.named_scope(param).first

può essere spense con:

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

Altri esempi di 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 si prega di dare un'occhiata a:

Viva i rspecs !!! :)

Suppongo che questo sia in una specifica di controllo?

Il vostro suggerimento dovrebbe funzionare bene. Un'altra possibilità è quella di spostare la chiamata named_scope all'interno del vostro modello, per evitare il problema del tutto. Questo sarebbe anche in linea con il "modelli di grasso, i controllori sottili" consigli.

Credo che tu abbia già fatto il sottile cosa regolatore mettendo la query in un ambito di nome dove può essere riutilizzato. Ecco il codice che ho usato prima ho iniziato ad usare gli ambiti di nome.

  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
# ...

Io probabilmente scrivere un codice molto simile a quello che hai già, ma forse metterlo in un aiutante che mi permette di riutilizzarlo. L'altra cosa è quello di utilizzare un quadro di scherno diverso che forse si dà più controllo. Date un'occhiata al Railscast Ryan Bates' sul RSpec - è un po 'vecchio, ma ora ancora alcune buone idee in là

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top