RSpecのと連鎖メソッドをスタブ
-
21-08-2019 - |
質問
私は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を見ている - それは今少し古いですが、そこにはまだいくつかの良いアイデア
。