# How to ガイド - 単体テストのための VCR の設定

ここでは、単体テスト向けに HTTP のやり取りを記録するよう VCR を設定する方法について説明します。

# 単体テストで VCR が必要な理由

VCR gem は RSpec のテストと連携して、テストスイートの実行時に送信される HTTP のやり取り (リクエスト) をすべて記録し、そのテストスイートが再度実行された場合は同じレスポンスを再生します。

これは、RSpec で安定したテストを行うために重要なことです。特に、データが常に変化する可能性のある環境では非常に重要です。たとえば、同じ GET リクエストに対して、後で異なるレスポンスになることがありますが、VCR を使用すると、以前取得した同じ HTTP レスポンスでテストを再生できるため、テストで同一のアサーションを記述できるようになります。

これにより、テストにおける変動性の一側面を取り除き、コードの変更についてのみテストを行えるようになります。

VCR の詳細については、こちら (opens new window) を確認してください。

# 開始方法

コマンド workato new [PATH] を使用してコネクタープロジェクトを生成すると、VCR が自動的に設定されます。

secure オプションを指定してプロジェクトを設定する場合、VCR 記録も暗号化されます。Workato では secure オプションを使用することをお勧めします。どのような場合でも、spec_helper.rb には、VCR 記録の設定に関するすべての情報が含まれています。プロジェクトを secure に設定することで、VCR 記録が master.key で暗号化されるようになります。暗号化を含む spec_helper.rb の例を以下に示します。

# frozen_string_literal: true

require 'bundler/setup'
require 'json'
require "webmock/rspec"
require "timecop"
require "vcr"
require "workato-connector-sdk"
require "workato/testing/vcr_encrypted_cassette_serializer"
require "workato/testing/vcr_multipart_body_matcher"

RSpec.configure do |config|
  # Enable flags like --only-failures and --next-failure
  config.example_status_persistence_file_path = ".rspec_status"

  # Disable RSpec exposing methods globally on `Module` and `main`
  config.disable_monkey_patching!

  config.expect_with :rspec do |c|
    c.syntax = :expect
  end
end

VCR.configure do |config|
  config.cassette_library_dir = "tape_library"
  config.hook_into :webmock
  config.cassette_serializers[:encrypted] = Workato::Testing::VCREncryptedCassetteSerializer.new
  config.register_request_matcher :headers_without_user_agent do |request1, request2|
    request1.headers.except("User-Agent") == request2.headers.except("User-Agent")
  end
  config.register_request_matcher :multipart_body do |request1, request2|
    Workato::Testing::VCRMultipartBodyMatcher.call(request1, request2)
  end
  config.default_cassette_options = {
    record: ENV.fetch('VCR_RECORD_MODE', :none).to_sym,
    serialize_with: :encrypted,
    match_requests_on: %i[uri headers_without_user_agent body]
  }
  config.configure_rspec_metadata!
end

TIP

デフォルトでは、secure の記録モードは none であり、新しい VCR カセットは記録されません。 新しい VCR カセットを記録するには、次のコマンド VCR_RECORD_MODE=once bundle exec rspec spec/actions/test_action_spec.rb を使用して RSpec のテストを実行してください。

# VCR の設定の変更は可能か

spec_helper.rb で変更することができます。必要に応じて spec_helper を変更することで、たとえば VCR では、送信 HTTP リクエストを以前記録したやり取りに一致させる条件を変更したり、緩和したりすることができます。

例 : spec_helper.rb を調整することで、さまざまな認証ヘッダーを受け入れるように VCR の一致条件を緩和させることができます。

config.register_request_matcher :headers_without_user_agent do |request1, request2|
  request1.headers.except('User-Agent', 'Authorization') == request2.headers.except('User-Agent', 'Authorization')
end


Last updated: 2023/8/31 1:07:14