現時点(rspec-mocks 2.10.1)ではunstub
but for に相当するメソッドはありませんshould_receive
。を使用してすべてのスタブとモックをリセットrspec_reset
できます。また、ダーティ ハックを記述して特定の期待を取り除くこともできます (これはお勧めしません)。
以下は、オブジェクトのすべてのスタブと期待を削除する例です。
describe "resetting stubs and expectations with rspec_reset" do
before do
@person = mock('person')
@person.should_receive(:poke)
end
it "should not fail when we reset all stubs and expectations" do
@person.rspec_reset
end
end
このメソッドは rspec ソース コードで として注釈されていることに注意してください。つまり@private
、必要以上に使用することは避けるべきであり、rspec の将来のバージョンでは警告なしに壊れる可能性があります。ただし、rspec自体の仕様でかなり広く使用されているため、これがすぐに非推奨になる可能性は低いと思われます.
rspec-mocks コードをもう少し掘り下げた後、もちろん、本当に厄介なことをして、1 つの特定の期待を自分で引き裂くことができます。
# Works in rspec 2.10.1
describe "removing an expectation with an ugly hack" do
before do
@person = mock('person')
@person.should_receive(:poke)
end
it "should not fail after we hack rspec by violating every law of good programming, ever" do
@person.instance_variable_get(:@mock_proxy).instance_variable_get(:@method_double)[:poke].clear
end
end
これは、rspec テスト パッケージのカプセル化に違反しているため、非常に悪いことであり、実行すべきではありません。代わりに、特定の期待を削除するやむを得ない理由がある場合は、rspec-mocks のアップストリームにパブリック メソッドを追加して、unstub
特定の期待を削除するための並列メソッドを追加するのが正しい方法です。おそらくここにあります(このファイルのstub
との定義に注意してください):unstub
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/methods.rb
外に出て期待を取り除くために上記の提案のいずれかを使用する前に、仕様が本当にこれを行う必要があるかどうか、またはそれらをリファクタリングする必要があるかどうかを検討することをお勧めします。Usingshould_receive
はコードに関するアサーションであり、通常はit
1 つのことだけをアサーションするサンプル (つまりブロック) を作成するようにしてください。rspec_reset
グローバルセットアップでやりすぎない限り(たとえばbefore :each
、または :all ブロックの前に)、または例がやりすぎないように(つまり、複数のアサーションを使用して)、次のようなものが必要な理由について非常に興味があります単一の例で)。
これに対する 1 つの例外は、もちろん、rspec_reset
スタブとモックを適用する機能をテストするサンプル間で状態をリセットするために使用される rspec-mocks のテスト スイートである可能性があります。そうしない限り、オブジェクトのスタブとモックのグローバル リセットに依存しないようにテストを改善できる可能性があります。
これがお役に立てば幸いです。また、同等のメソッドを追加する正当なケースがあると思われる場合はお知らせくださいunstub
が、メッセージの期待のため (つまり、使用後should_receive
) です。これが問題ないと確信できる場合は、このメソッドを追加し、上流に追加することを提案することを検討します。多分それは呼ばれるunset_expectation
でしょうか?また、上記のコードと内部構造のガイダンスを自由に使用して、自分で rspec-mocks のプル リクエストをまとめてくださいunstub
。