質問

私は1つのレコードのみが返されますnamed_scopeを呼びたいが、named_scopeは配列を返し、私はちょうど1次回でそれをチェーンすることができますよう、それは大したことではないのです。

Model.named_scope(param).first

これは動作しますが、私が苦しんでいますと、チェーン呼び出しをスタブする方法です。誰もが参照または私はRSpecのモックのでこれを達成するために行くか方法についての答えを持っていますか?

役に立ちましたか?

解決

私は何かを考え出しました。

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

私のコントローラを呼び出すことができます:

@client = Client.named_scope(param).first

これは動作しますが、よりよい解決策はありますか?

EDITます:

RSpecの1.2.6のリリースでは、私たちはそれが今することができ意味stub_chain使用することができます

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

このは常に仕様のAPIをチェックして、私の頭の上だった:)

他のヒント

より良いバージョン

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

になります:

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

質問はかなり古いですので、いくつかの機能強化を行うことができますスタブ方法です。今、あなたは、メソッド呼び出しのチェーンをスタブにしstub_chainメソッドを使用することができます。 たとえばます:

@client = Client.named_scope(param).first

でスタブすることができます:

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

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

<のhref = "https://www.relishapp.com/rspec/rspec-mocks/v/2-0/docs/stubs/stub-a-chain-of-methods#stub-a-chain- 「RELは= "nofollowを" メソッド-の>かを見ていてください。の

ロングrspecsを生きます! :)

私は、これは、コントローラの仕様であると仮定?

あなた自身の提案が正常に動作する必要があります。別の可能性は完全に問題を回避するために、モデル内のnamed_scopeコールを移動することです。これはまた、「脂肪のモデル、細いコントローラ」アドバイスに沿ったものになります。

私は、あなたはすでにそれを再利用できるという名前のスコープにクエリを置くことによって、薄いコントローラのことをやったと思います。ここで私は名前のスコープを使用して開始する前に、私が使用されるいくつかのコードがある。

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

私はおそらくあなたがすでに持っているものと非常によく似たコードを記述しますが、多分私はそれを再利用することを可能にするヘルパーに入れてしまいます。他の事は多分あなたより詳細に制御できます別のモックフレームワークを使用することです。 RSpecの上ライアンベイツrailscastを見ている - それは今少し古いですが、そこにはまだいくつかの良いアイデア

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top