You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保所有HTTP请求均通过WebMock进行拦截?

解决WebMock未拦截HTTP请求的问题

你配置WebMock禁用网络连接后,Net::HTTP.get仍能正常执行,核心原因是VCR的allow_http_connections_when_no_cassette配置覆盖了WebMock的网络限制。当VCR与WebMock集成时,这个选项会允许在未使用VCR cassette的情况下发起真实HTTP请求,导致WebMock的拦截规则失效。

解决方案:

  • 调整VCR核心配置
    将allow_http_connections_when_no_cassette设置为false,这样即使未使用cassette,VCR也会通过WebMock拦截所有外部HTTP请求:

    VCR.configure do |c|
      c.cassette_library_dir = Rails.root.to_s + "/test/vcr_cassettes"
      c.hook_into :webmock
      c.allow_http_connections_when_no_cassette = false # 修改此配置项
      c.default_cassette_options= {:serialize_with => :yaml, :record => :once, :allow_playback_repeats => true}
    end
    
  • 优化WebMock测试配置
    测试文件中无需重复调用WebMock.enable!(webmock/minitest已自动在测试环境启用WebMock),可以明确指定网络拦截规则,比如允许本地请求、拦截外部请求:

    require "test_helper"
    require "webmock/minitest"
    
    class URLTest < ActiveSupport::TestCase
      test "valid urls" do
        # 可选:允许localhost请求,拦截所有外部网络请求
        WebMock.disable_net_connect!(allow_localhost: true)
        assert_raises(WebMock::NetConnectNotAllowedError) do
          Net::HTTP.get("www.google.com", "/")
        end
      end
    end
    
  • 确认依赖加载顺序
    确保webmock/minitest在test_helper之后加载,避免VCR的配置先于WebMock生效导致拦截规则被覆盖。

内容的提问来源于stack exchange,提问作者Tom Rossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:24:56