ハウツーガイド - ユニットテスト用のVCRの設定

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

このセグメントでは、ユニットテスト用にHTTPインタラクションを記録するようにVCRを設定する方法について説明します。

ユニットテストにVCRが必要な理由

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

これは、データが絶えず変化する可能性があるEnvironmentで作業している場合に、安定したRSpecテストを実現するために特に重要です。 たとえば、同じGETリクエストでも後で異なるレスポンスが返される可能性がありますが、VCRでは以前に確認したものと同じHTTPレスポンスでテストを再生できるため、テストで同じアサーションを実行できます。

これにより、テストにおける変動要素の1つが除去され、コードの変更のみをテストし、それ以外はテストしないようにできます。

VCRの詳細

開始方法

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

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

ruby
# 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で実行できます。 VCRが送信HTTPリクエストを以前に記録されたインタラクションと照合する方法に関する条件を変更または緩和するなど、必要に応じてspec_helperを変更できます。

例:spec_helper.rbを調整して、異なるAuthorization Headersを受け入れるようにVCRマッチングを緩和する

ruby
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: