ハウツーガイド - ユニットテスト用のVCRの設定
このセグメントでは、ユニットテスト用にHTTPインタラクションを記録するようにVCRを設定する方法について説明します。
ユニットテストにVCRが必要な理由
VCR gemはRSpecテストと連携し、テストスイートの実行時に送信されるすべてのHTTPインタラクション(リクエスト)を記録し、テストスイートを再度実行した場合に同じレスポンスを再生します。
これは、データが絶えず変化する可能性があるEnvironmentで作業している場合に、安定したRSpecテストを実現するために特に重要です。 たとえば、同じGETリクエストでも後で異なるレスポンスが返される可能性がありますが、VCRでは以前に確認したものと同じHTTPレスポンスでテストを再生できるため、テストで同じアサーションを実行できます。
これにより、テストにおける変動要素の1つが除去され、コードの変更のみをテストし、それ以外はテストしないようにできます。
開始方法
コマンドworkato new [PATH]を使用してコネクタープロジェクトを生成すると、VCRが自動的に設定されます。
secureオプションを使用してプロジェクトを設定すると、VCR記録も暗号化されます。 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!
endTIP
デフォルトでは、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マッチングを緩和する
config.register_request_matcher :headers_without_user_agent do |request1, request2|
request1.headers.except('User-Agent', 'Authorization') == request2.headers.except('User-Agent', 'Authorization')
endLast updated: