webmockを使っていると、テストの実行中、WebMockオブジェクトにstubしたリクエストが蓄積していく。 リクエストstubのインスタンスを使って呼び出しの検証を行っていると、場合によっては偽陽性や偽陰性をもたらしてしまう可能性がある。
webmockには
それぞれインスタンスを削除する仕組みがあり、ほとんどREADMEにも書いてある内容ではあるが、備忘としてまとめておく。
database_cleanerを使ったDBのリセットの要領で、テストsuiteの終了時にWebMockインスタンスをリセットする。
config.after(:each) do
WebMock.reset!
end
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
メソッドを使って対象や削除の範囲を絞るのがよさそうだと思っている。