Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在使用Capybara进行测试时,如何故意延迟AJAX响应?_Ruby On Rails_Ajax_Rspec_Capybara_Capybara Webkit - Fatal编程技术网

Ruby on rails 在使用Capybara进行测试时,如何故意延迟AJAX响应?

Ruby on rails 在使用Capybara进行测试时,如何故意延迟AJAX响应?,ruby-on-rails,ajax,rspec,capybara,capybara-webkit,Ruby On Rails,Ajax,Rspec,Capybara,Capybara Webkit,我有一个React组件,它模仿了大多数现代社交媒体网站的“链接预览”功能。您键入一个链接,它会获取图像、标题等 为此,我让React组件向我的服务器回拨AJAX,以获取URL预览数据 在抓取时,我显示一个中间的“加载”状态(即一些加载图标或旋转轮) 相关的React代码段如下所示 this.setState({ isLoadingAttachment: true }) return $.ajax({ type: "GET", url: some_url, dataType: "j

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

为此,我让React组件向我的服务器回拨AJAX,以获取URL预览数据

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

相关的React代码段如下所示

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
state变量如何在服务器进行抓取时仅在短时间内有效。成功和错误场景都会立即禁用它

我想在“加载”状态下用我的水豚特性规范测试一些功能。我模拟了服务器返回的所有web调用和数据,但这一切发生得太快,以至于在我可以对其运行任何
expect()…
语句之前,它就通过了“加载”状态。我还特意不调用
wait\u for\u 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
我该怎么做呢


谢谢

Capybara在与测试不同的线程中启动应用程序服务器,但是如果您使用默认的
Capybara.server
设置,您的应用程序可能会自动调用,因为它默认使用webrick。相反,您应该指定
Capybara.server=:puma
。除此之外,在功能规格(通常指端到端测试)中,模拟响应通常是一个坏主意,因为这意味着您实际上不再以生产中运行的方式测试应用程序代码。一个更好的解决方案是使用类似于“吹嘘比利”(puffing billy)的东西,在你的应用程序代码之外模拟网络响应,这将允许你做类似的事情

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

谢谢还有一个后续问题-是什么使
puma
成为服务器比
webrick
更好的选择?我认为服务器是不相关的,因为它们都产生相同类型的response@user2490003
puma
默认情况下是多线程的,将同时处理多个请求(例如一个对应用程序的请求正在向同一个应用程序发出另一个请求)-99%确定您在生产中没有使用webrick,也许你在用美洲狮?最好使测试环境尽可能与生产环境匹配。你是对的,我在生产环境中使用Puma。谢谢你的解释!