在 Capybara 中模拟网络故障/离线模式?

Lou*_*eau 5 ruby bdd rspec capybara

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

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

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

Tim*_*ore 1

我的团队已经删除了 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
Run Code Online (Sandbox Code Playgroud)