【问题标题】:Simulate network failure / offline mode in Capybara?在 Capybara 中模拟网络故障/离线模式?
【发布时间】:2014-07-24 12:35:00
【问题描述】:

我的应用中有一些 JavaScript 可以检测网络连接何时断开,并将数据临时缓存在本地存储中,以便在重新建立连接时与服务器同步。

我一直在尝试找到一种方法来使用 Capybara 进行端到端测试,但我似乎找不到任何方法可以暂时禁用应用服务器或将无头浏览器切换到离线模式。 FWIW 我使用 Poltergeist 作为驱动程序。

有人知道如何测试吗? (我可以使用 sinon 来测试 JavaScript 应用程序以假装服务器消失,但如果可能的话,我希望能够使用无头浏览器对其进行端到端测试)。

【问题讨论】:

    标签: ruby rspec capybara bdd


    【解决方案1】:

    我还发现了另一种选择。启动 Chrome

    options.add_argument('--host-resolver-rules=MAP * ~NOTFOUND')
    

    我在chromium docs 中看到了这个,因为google-chrome --help 中缺少这个标志。

    哪个链接也意味着你也可以使用自己的代理服务器来模拟不同的条件。

    【讨论】:

      【解决方案2】:

      如果您在寻找使用 Capybara 和 Chrome Headless 测试离线/渐进式 Web 应用程序的方法时偶然发现了这个问题,请按以下方法操作:

      params = {
        cmd:    'Network.emulateNetworkConditions',
        params: {
          offline:            true,
          latency:            0,
          downloadThroughput: 0,
          uploadThroughput:   0
        }
      }
      page.driver.browser.send(:bridge).send_command(params)
      

      【讨论】:

      【解决方案3】:

      我的团队已将 Rack 应用程序排除在外,以模拟来自服务器的错误。它运行良好(在 Firefox 中)。以下是代码的一些相关摘录:

      class NoResponseRack
        attr_reader :requests
      
        def initialize disconnected_mode
          @disconnected_mode = disconnected_mode
      
          @requests = []
          @sleeping_threads = []
        end
      
        def call(env)
          @requests.push(env)
      
          case @disconnected_mode
          when :elb_pool_empty
            @sleeping_threads << Thread.current
            sleep 65
            @sleeping_threads.delete Thread.current
            [504, {}, ['']]
          when :server_maintenance
            [200, {}, ['status_message=Atlas is down for maintenance.']]
          else
            [999, {}, [""]]
          end
        end
      
        def wakeup_sleeping_threads
          @sleeping_threads.each &:wakeup
          @sleeping_threads.clear
        end
      end
      
      def go_disconnected_with_proxy disconnected_mode=:server_error
        if $proxy_server_disconnected
          puts 'going DISconnected'
          $current_proxy = NoResponseRack.new disconnected_mode
          rack_mappings.unshift([nil, "", /^(.*)/n, $current_proxy])
      
          $proxy_server_disconnected = false
        end
      end
      
      def rack_app
        Capybara::current_session.driver.app
      end
      
      def rack_mappings
        rack_app.instance_variable_get(:@mapping)
      end
      

      【讨论】:

      • 在最新版本的 Capybara (2.4) 中,Rack 应用程序被包装在另一个对象中,因此您需要:Capybara::current_session.driver.app.get_instance_variable(:@app) 来获取其中包含 @mapping 的东西。
      【解决方案4】:

      我能想到的唯一方法是允许主机在您的测试中被覆盖,并给它一个虚假主机(类似于 localhost:31337)。

      也许看看http://robots.thoughtbot.com/using-capybara-to-test-javascript-that-makes-http,看看有没有什么东西跳出来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 2014-11-28
        相关资源
        最近更新 更多