Ruby on rails 如何让Capybara在Cucumber特性中执行删除请求?

Ruby on rails 如何让Capybara在Cucumber特性中执行删除请求?,ruby-on-rails,cucumber,integration-testing,capybara,Ruby On Rails,Cucumber,Integration Testing,Capybara,我用的是黄瓜和水豚。我需要发出一个HTTPDELETE请求。以前的特性使用webrat,所以一个简单的语句 visit "/comment/" + comment_id, :delete 工作了,但现在我在用水豚 执行GET请求的方法很简单: get 'path' 以及进行post请求: page.driver.post 'path' 但是如何模拟DELETE请求呢 我发现驱动程序Capybara正在使用isCapybara::RackTest::driver,如果有帮助的话 我也尝试过:

我用的是黄瓜和水豚。我需要发出一个HTTP
DELETE
请求。以前的特性使用webrat,所以一个简单的语句

visit "/comment/" + comment_id, :delete
工作了,但现在我在用水豚

执行
GET
请求的方法很简单:

get 'path'
以及进行post请求:

page.driver.post 'path'
但是如何模拟
DELETE
请求呢

我发现驱动程序Capybara正在使用is
Capybara::RackTest::driver
,如果有帮助的话

我也尝试过:

Capybara.current_session.driver.delete "/comments/" + comment_id
但这是行不通的

page.driver.submit :delete, "/comments/#{comment_id}", {}

文档位于:

如果您使用的驱动程序不支持自定义HTTP请求(例如Capybara webkit,请参阅和current),您可以临时切换到RackTest驱动程序以提交请求

例如:

# Submit an HTTP delete request, using rack_test driver
def http_delete path
  current_driver = Capybara.current_driver
  Capybara.current_driver = :rack_test
  page.driver.submit :delete, path, {}
  Capybara.current_driver = current_driver
end

这在硒中起作用。它假设您在调用它的任何页面上都有一个注销按钮/链接

而不是:

visit '/logout'
做:

使用
delete
可以正常工作。无需为此使用较低级别的
submit
方法


PS:如果您需要保留会话信息的解决方案(例如,如果您需要以身份验证用户的身份发出
删除
请求),则使用capybara webkit 1.6.0和capybara 2.4.4进行测试,并且将使用
:rack_test
驱动程序和
:webkit
驱动程序(假设您的应用程序中有jQuery可用),请尝试以下操作:

def manual_http_request(method, path)
  if Capybara.current_driver == :rack_test
    page.driver.submit method, path, {}
  else
    page.execute_script("$.ajax({url: '#{path}', data: {}, type: '#{method}'});")
    # Wait for the request to finish executing...
    Timeout.timeout(10) { loop until page.evaluate_script('jQuery.active').zero? }
  end
end

我怀疑这也适用于
:selenium
驱动程序,但尚未对其进行测试。也许其他人可以插话进来。

您的网页上是否有链接或按钮会触发删除?Cumber功能应该是一个完整的堆栈验收测试。您的功能步骤应该会让您顺利完成整个过程应用程序。你应该遵循链接,按下按钮,填写数据等,然后你可以简单地通过这样做触发删除。当我编写新的测试时,你的建议是这样做的首选方式,但目前我正在从webrat迁移到capybara。我不想通过重写来修改30个左右的测试,我想rst让它们使用capybara工作,然后可能会在以后根据需要重写它们。真的很奇怪,因为这些方法都包含在RackTest驱动程序中:值得一提的是,这种方法是RackTest驱动程序所独有的,所以在Selenium或capybara-webkit中不起作用。这对capybara webkit很好(我怀疑硒也是如此。)+1为此感谢上帝。在测试“快乐之路”时,这当然不是一种需要的技术,但这使我更容易测试访问控制并确保我的before筛选器正常工作。此解决方案要好得多。谁知道您将来将使用什么驱动程序。此解决方案有一个(潜在的)大问题:它不会保留以前请求中的任何会话或cookie信息。因此,例如,如果您需要以身份验证用户身份发出
DELETE
请求,此代码可能无法工作(除非您已经在使用
:rack\u test
驱动程序)。有关保留会话信息的方法,请参阅。这很好!我不需要selenium和chromedriver的超时
page.driver.delete("/comments/#{comment_id}")
def manual_http_request(method, path)
  if Capybara.current_driver == :rack_test
    page.driver.submit method, path, {}
  else
    page.execute_script("$.ajax({url: '#{path}', data: {}, type: '#{method}'});")
    # Wait for the request to finish executing...
    Timeout.timeout(10) { loop until page.evaluate_script('jQuery.active').zero? }
  end
end