背景
VCRというHTTPリクエストをモックするGemがあります。Rubyのテストコードで使います。
VCRでは設定ファイルに、HTTPリクエストとそれに対応するレスポンスの組合せを記述し、モックを作成します。VCRを有効にしてテストコードを実行すると、VCRは、次のように動きます
- テスト実行中に送信されるHTTPリクエストを監視します
- HTTPリクエストの送信を見つけると、設定ファイル内のHTTPメソッドとURIが一致する、HTTPリクエストを探します
- HTTPリクエストが見つかれば、そこに記述されたHTTPレスポンスを返します。
また、設定ファイル中に一致するHTTPリクエストが見つからなかった場合は例外を上げます。
意図していないHTTPリクエストを送信したことが検出できます。
他のWeb APIに依存したRubyアプリケーションを開発するときに重宝します。
問題
デフォルトのHTTPリクエストの一致条件は、HTTPリクエストのメソッド名とURI文字列です。
GETリクエストの場合、メソッドとURIで一致を判定すれば、十分です。
POSTリクエストの場合、一致条件に「HTTPリクエスト Bodyの内容」を追加したいことがあります。
Bodyを一致条件に追加すれば、POSTリクエストの送信内容が期待通りの情報が入っているかどうか確認できます。
ソースコード修正時に、意図せずに送信するHTTPリクエストのBody変更しても、テストで検出できるようになります。
方法
Request matching - Cassettes - Vcr - VCR - Relish によれば
You can customize how VCR matches requests using the :match_requests_on option.
翻訳すると
:match_requests_onオプションを使用して、VCRがリクエストを照合する方法をカスタマイズできます。
use_cassette メソッドの引数で指定
https://relishapp.com/vcr/vcr/v/5-0-0/docs/request-matching/matching-on-body に次の例があります。
VCR.use_cassette('example', :match_requests_on => [:body]) do
puts "Response for body2: " + response_body_for(:put, "http://example.com/", "body2")
end
VCRではuse_cassette
メソッドで、テスト時に使用する設定ファイルを指定します。
同時に、 引数:match_requests_on
でリクエストの一致条件を指定できます。
グローバルに設定する方法
VCR.configure do |config|
config.default_cassette_options = {:record=>:once, :match_requests_on=>[:method, :uri, :body], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
end
が参考になります。
一度この設定をすれば、それ以降のすべてのVCR.use_cassette
では、設定したリクエスト一致条件が
使われます。
パラメーター
config.default_cassette_options = { match_requests_on: [:body] }
と、指定すると、一致条件からメソッドとURIはなくなり、ボディだけになります。
メソッドとURIを残したい場合は次のように指定します。
config.default_cassette_options = { match_requests_on: [:method, :uri, :body] }