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