如何让Capybara在Cucumber功能中执行DELETE请求?

时间:2012-02-10 13:55:51

标签: ruby-on-rails cucumber integration-testing capybara

我正在使用Cucumber和Capybara。我需要发出HTTP DELETE请求。以前使用webrat的功能,所以简单的声明如

visit "/comment/" + comment_id, :delete

工作,但现在我正在使用Capybara。

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

get 'path'

要发布帖子请求:

page.driver.post 'path'

但是如何模拟DELETE请求?

我发现驾驶员Capybara正在使用的是Capybara::RackTest::Driver,如果有任何帮助的话。

我也尝试过:

Capybara.current_session.driver.delete "/comments/" + comment_id

但这不起作用。

5 个答案:

答案 0 :(得分:29)

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

文档:http://rubydoc.info/gems/capybara/1.1.2/Capybara/RackTest/Browser:submit

答案 1 :(得分:6)

如果您使用的驱动程序不支持自定义HTTP请求(例如Capybara-webkit,请参阅closed issue和当前driver),您可以暂时切换到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

答案 2 :(得分:1)

page.driver.delete("/comments/#{comment_id}")

使用delete正常工作。无需使用较低级submit方法。

PS:使用capybara-webkit 1.6.0和capybara 2.4.4进行测试

答案 3 :(得分:1)

如果您需要一个保留会话信息的解决方案(例如,如果您需要将DELETE请求作为经过身份验证的用户发出),那么这将同时适用于{ {1}}驱动程序 :rack_test驱动程序(假设您的应用程序中有jQuery可用),请尝试以下操作:

:webkit

我怀疑这也适用于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 驱动程序,但尚未对其进行测试。也许其他人可以参与其中。

答案 4 :(得分:0)

这适用于硒。假设您在

上调用的任何页面上都有一个注销按钮/链接

而不是:

visit '/logout'

执行:

def logout_user
  logout_link = page.first('#my_css_selector')
  logout_link.click if logout_link
end

#... elsewhere in a step
logout_user