【问题标题】:How to purposely delay an AJAX response while testing with Capybara?如何在使用 Capybara 进行测试时故意延迟 AJAX 响应?
【发布时间】:2017-02-28 02:34:25
【问题描述】:

我有一个 React 组件,它模仿了大多数现代社交媒体网站所具有的“链接预览”功能。您输入一个链接,它会获取图像、标题等...

我通过让 React 组件向我的服务器进行 AJAX 回调来获取 URL 预览数据来做到这一点。

在获取时,我显示了一个中间“加载”状态(即一些加载图标或旋转轮)

相关的 React sn-p 看起来像

this.setState({ isLoadingAttachment: true })

return $.ajax({
  type: "GET",
  url: some_url,
  dataType: "json",
  contentType: "application/json",
}).success(function(response){
  // Succesful! Do Success stuff
  component.setState({ isLoadingAttachment: false })
}).error(function(response) {
  // Uh oh! Handle failure stuff
  component.setState({ isLoadingAttachment: false })
});

请注意isLoadingAttachment 状态变量如何仅在服务器进行提取时有效一秒钟。成功和错误场景都会立即禁用它。

我想在“加载”状态下使用 Capybara 功能规范测试一些功能。我已经模拟了所有的网络调用和服务器要返回的数据,但这一切都发生得如此之快,以至于它在我什至可以在其上运行任何expect().. 语句之前就通过了“加载”状态。我也故意不打电话给wait_for_ajax,这样页面就会继续前进而无需等待ajax,但它仍然太快了。

最后,我还尝试故意将服务器调用延迟 1.0 秒,但这也不起作用。我假设是因为整个事情都是单线程的?

# `foo` is an arbitrary method called during the server-side execution
allow_any_instance_of(MyController).
  to receive(:foo) { sleep(1.0) }.and_call_original

有什么想法可以做到这一点吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ajax rspec capybara capybara-webkit


    【解决方案1】:

    Capybara 在与测试不同的线程中启动应用服务器,但是如果您使用默认的 Capybara.server 设置,您的应用可能会在回调自身时遇到问题,因为它默认使用 webrick。相反,您应该指定Capybara.server = :puma。除此之外,在功能规范(通常意味着端到端测试)中,模拟响应通常是一个坏主意,因为这意味着您实际上并没有像在生产中运行的那样测试您的应用程序代码。更好的解决方案是使用 puffing-billy - https://github.com/oesmith/puffing-billy 之类的东西来模拟您的应用程序代码之外的网络响应,这将允许您执行类似的操作

    proxy.stub('https://example.com/proc/').and_return(Proc.new { |params, headers, body|
      sleep 2
      { :text => "Your results"}
    })
    

    【讨论】:

    • 谢谢!另一项后续行动 - 是什么让 puma 成为比 webrick 更好的服务器选择?我会认为服务器无关紧要,因为它们都产生相同类型的响应
    • @user2490003 puma 默认情况下是多线程的,并且会同时处理多个请求(例如对您的应用的一个请求正在向同一个应用发出另一个请求) - 同样 99% 确定您不是在生产中使用 webrick,也许你正在使用 puma?最好让测试环境与生产环境尽可能匹配。
    • 你是对的,我在生产中使用 Puma。感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多