2
0

More than 3 years have passed since last update.

VCRのmatch_requests_onを変更する

Posted at

背景

VCRというHTTPリクエストをモックするGemがあります。Rubyのテストコードで使います。

VCRでは設定ファイルに、HTTPリクエストとそれに対応するレスポンスの組合せを記述し、モックを作成します。VCRを有効にしてテストコードを実行すると、VCRは、次のように動きます

  1. テスト実行中に送信されるHTTPリクエストを監視します
  2. HTTPリクエストの送信を見つけると、設定ファイル内のHTTPメソッドとURIが一致する、HTTPリクエストを探します
  3. 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] }

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0