メインコンテンツまでスキップ

unstub の使用方法

unstub は、メソッドスタブを削除し、メソッドスタブをクリーンアップするためのものです。これにより、例の最後に実行されるクリーンアップを待つのではなく、メソッドスタブを早期にクリーンアップすることができます。新しいモンキーパッチのない構文には直接の相当するものはありませんが、ほとんどの場合、and_call_original を使用することで同じ動作を実現できます。違いは、obj.unstub(:foo)foo メソッドスタブを完全にクリーンアップするのに対して、allow(obj).to receive(:foo).and_call_original はメソッドの呼び出しを引き続き監視します(スパイ を使用している場合に重要です)。これは、caller を使用して何かしらの処理を行う場合に、追加の RSpec スタックフレームが含まれるため、メソッドの動作に影響を与える可能性があります。

背景

以下の内容で "spec/spec_helper.rb" という名前のファイルがあるとします:

RSpec.configure do |config|
config.mock_with :rspec do |mocks|
mocks.syntax = :should
end
end

また、以下の内容で ".rspec" という名前のファイルがあるとします:

--require spec_helper

メソッドのアンスタブ化

以下の内容で "spec/unstub_spec.rb" という名前のファイルがあるとします:

RSpec.describe "Unstubbing a method" do
it "restores the original behavior" do
string = "hello world"
string.stub(:reverse) { "hello dlrow" }

expect {
string.unstub(:reverse)
}.to change { string.reverse }.from("hello dlrow").to("dlrow olleh")
end
end

rspec spec/unstub_spec.rb を実行すると、

すべての例がパスするはずです。