kakudooo docs

webmockのstubを削除する方法

概要

webmockを使っていると、テストの実行中、WebMockオブジェクトにstubしたリクエストが蓄積していく。 リクエストstubのインスタンスを使って呼び出しの検証を行っていると、場合によっては偽陽性や偽陰性をもたらしてしまう可能性がある。

webmockには

それぞれインスタンスを削除する仕組みがあり、ほとんどREADMEにも書いてある内容ではあるが、備忘としてまとめておく。

テストケース毎にリクエストstubを削除する

database_cleanerを使ったDBのリセットの要領で、テストsuiteの終了時にWebMockインスタンスをリセットする。

config.after(:each) do
    WebMock.reset!
end

個別のリクエストstubオブジェクトを削除する

remove_request_stub メソッドを使う例

stub_get = stub_request(:get, "www.example.com")
remove_request_stub(stub_get)

WebMock.reset_executed_requests! メソッドを使う例

stub  = stub_request(:get, "www.example.com")
stub2 = stub_request(:get, "www.example2.com")

Net::HTTP.get('www.example.com', '/')
Net::HTTP.get('www.example.com', '/')

Net::HTTP.get('www.example2.com', '/')

expect(stub).to have_been_requested.times(2)
expect(stub2).to have_been_requested.times(1)

WebMock.reset_executed_requests!

expect(stub).not_to have_been_requested
expect(stub2).not_to have_been_requested

リクエストstubを毎回リセットする必要のあるケースは多くないはず。 個人的には、remove_request_stub メソッドを使って対象や削除の範囲を絞るのがよさそうだと思っている。