Ruby on rails 在使用Capybara进行测试时,如何故意延迟AJAX响应?
我有一个React组件,它模仿了大多数现代社交媒体网站的“链接预览”功能。您键入一个链接,它会获取图像、标题等 为此,我让React组件向我的服务器回拨AJAX,以获取URL预览数据 在抓取时,我显示一个中间的“加载”状态(即一些加载图标或旋转轮) 相关的React代码段如下所示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
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@user2490003puma
默认情况下是多线程的,将同时处理多个请求(例如一个对应用程序的请求正在向同一个应用程序发出另一个请求)-99%确定您在生产中没有使用webrick,也许你在用美洲狮?最好使测试环境尽可能与生产环境匹配。你是对的,我在生产环境中使用Puma。谢谢你的解释!