Techioz Blog

レールシステムテストでカセットを使用しないVCR

概要

次のテストでは:

require "application_system_test_case"

class ImportTest < ApplicationSystemTestCase
  test "importing vacancy succeeds" do
    VCR.use_cassette("import_success", record: :all) do
      user = users(:role)
      sign_in(user)

      visit new_externals_path

      within "form.form" do
        fill_in "External ID", with: "57524"

        click_on "Import Vacancy"
      end

      # TODO: Check that the imported vacancy is displayed
    end
  end
end

デバッグ ログをオンにすると、VCR は次のように出力します。

[Cassette: 'import_success'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 0 interaction(s): {  }
[webmock] Identified request type (recordable) for [post https://url.com/oauth/idp]
[webmock] Handling request: [post https://url.com/oauth/token] (disabled: false)
[webmock] Identified request type (unhandled) for [post https://url.com/oauth/token]

Rails はカセットを見つけられず、カセットを提供するように要求しますが、私にはまったく理解できません。

解決策

私もこれで問題を抱えていましたが、ページへの変更を待っていない/期待していないことが問題であることがわかりました。そのため、テストで最後の UI インタラクションを行った直後、要求が行われる前に、VCR がカセットをイジェクトしました。トリガーが完了するまでに時間がありました。

私はその UI インタラクションを処理するために Turbo を使用していたので、それがリクエストの完了を待たなかった理由に関係している可能性があると思います。