わからない受信.TO(dummy_class)を可能にします。
現在、あなたは
allow(dummy_class).to receive(:item_class).and_return(item_class)
が、item_class
を使用しようとしているが、それだけでlocal_variable
ある方法ではありません。一言で言えば
Message Allowance構文構文はexpect(object).to receive(method_name).with(arguments).and_return(return_value)
あるので、多分あなたは何を意味するのかfind_item
以来allow(dummy_class).to receive(:find_item).with(item_class).and_return(item_class)
たallow(object).to receive(method_name).with(arguments).and_return(return_value)
とMessage Expectationある方法は、実際に呼び出されて、あなたがしているので、item_class
は、渡された引数であるが、戻り値をスタブすると、メソッド本体が決して発生しません。
allow(dummy_class).to recieve(:find_item).and_call_original
これ以上のことがありますが、dummy_class
はダブルではなく、既にfind_item
の元のバージョンを呼び出すことを「許可」されているため、これは実際に目的を果たしません。
ネイティブ機能をdummy_class
とし、ちょうどallow(item_class).to receive(:find_or_initialize_by)
とすると、次のように動作します。
it 'calls find_or_initialize_by' do
item_class = double("Item")
allow(item_class).to recieve(:find_or_initialize_by) #needed because it is a test double and knows nothing
expect(item_class).to receive(:find_or_initialize_by)
dummy_class.find_item("item1", item_class) #used test double here to trap messages
end
代わりに、我々はItem
の部分的な二重を使用してTest Doubleitem_class
例えばをスキップすることができます
#please note this binds the test to Item existing
it 'calls find_or_initialize_by' do
allow(Item).to receive(:find_or_initialize_by) #now a stubbed method on a partial double(Item)
expect(Item).to receive(:find_or_initialize_by)
dummy_class.find_item("item1", Item) #used the partial double
end
Partial doubles彼らはダブルスを検証することができ、Object
が実際にそれをスタブする前に、そのメソッドを定義して確認しますので、いいです。なぜなら、彼らはあなたのテストの性質とdummy_class
が二重ではないという事実(allow
何もすることは必要はありません)与えられたとされていると、あなただけのコール任意の戻り値をテストしていない、私はちょうどSpyを使用することをお勧めだろうと
単にメッセージの期待のためのものです。 これはテストは、単純明確にし、すべての依存関係の自由ます:
it 'calls find_or_initialize_by' do
item = spy("item")
dummy_class.find_item("item1", item)
expect(item).to have_received(:find_or_initialize_by)
end
は、彼らはあまりにも部分的な二重の味に来るが、これはItem
が知られており、Object
をロードしているに依存している:上記の(非常に似ていますが、期待呼び出しの効果後)
#please note this binds the test to Item existing
it 'calls find_or_initialize_by' do
allow(Item).to receive(:find_or_initialize_by)
dummy_class.find_item("item1", Item)
expect(Item).to have_received(:find_or_initialize_by)
end
はまた、私はそれがうまくなどとして適切な引数で呼び出されたことをテストを示唆しているのは、Module1
で(...)
がname: str
のように見えると仮定しましょう
これにより、コールが行われただけでなく、予想される引数がコールに渡されたことが保証されます。それはあなたのテストが独立し、速いなるため
特にメッセージの期待のModule
テストで私は(Item
がもう存在しないとどうなるんでしょうか?)テストダブルスとスパイに維持しようとする
をこんにちは、あなたは詳細を追加することができますあなたが得るエラー? – Bohdan
私の投稿を更新しました – andgursky
http://stackoverflow.com/help/accepted-answer – engineersmnky