【问题标题】:Testing destroy methods with capybara用 capybara 测试破坏方法
【发布时间】:2011-05-03 14:55:45
【问题描述】:

我已经使用 Capybara 编写了一些测试,但我没有使用 selenium,也没有使用任何其他 JS 驱动程序。但我怀疑我是否可以通过这种方式测试破坏方法?由于我需要确认一个 JS 确认并且 data-method = "delete" 无法访问...

我想做一些非常像水豚的方式:

访问'/people/123', :data-method => '删除'

你们知道有什么办法吗?

提前致谢, 安德烈

【问题讨论】:

    标签: javascript ruby-on-rails-3 capybara destroy


    【解决方案1】:

    Rails 有 JavaScript 代码,它从链接的 hrefdata-method 属性生成一个表单并提交它;如果没有 JS,这将无法工作。

    一种测试方法:首先,测试是否存在链接和适当的属性(hrefdata-method),然后使用Capybara::RackTest::Driver#delete method 手动触发删除请求。如果您经常这样做,请编写一个包含这两个步骤的辅助方法。

    【讨论】:

    • 感谢您的回答。除此之外,我还发现了一篇关于同样问题的博文 (blog.ardes.com/2010/4/28/…),他设法通过以下代码解决了这个问题: rack_test_session_wrapper = Capybara.current_session.driver rack_test_session_wrapper.process :delete,mycontrollerpath(@item)
    【解决方案2】:

    @Mike Mazur 的回答需要注意一点,如果您的控制器对 #destroy 操作执行重定向,则在 Capybara 的驱动程序上调用 delete 方法实际上不会遵循重定向。相反,它只是用重定向消息填充response,即body == <html><body>You are being <a href=\"http://www.example.com/model_names\">redirected</a>.</body></html>status_code == 302

    因此,要像在普通 Capybara click_button 'Delete Model' 上所期望的那样填充所有内容,您需要手动遵循重定向。一种(未重构和 RSpec 风格的)方法:

    Capybara.current_session.driver.delete controller_path(model_instance)
    Capybara.current_session.driver.response.should be_redirect
    visit Capybara.current_session.driver.response.location
    

    【讨论】:

    • 哇,这太完美了。谢谢。您指定 Capybara.current_session 与仅使用页面的任何原因?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2011-10-28
    相关资源
    最近更新 更多