【问题标题】:RSpec2 and CapybaraRSpec2 和水豚
【发布时间】:2011-08-31 17:05:56
【问题描述】:

水豚让我很困惑。如果我将 Capybara 与 Ruby on Rails 3 和 RSpec 2 结合使用,那么在 RSpec 请求测试中,以下匹配器可以工作:

response.body.should have_selector "div.some_class"

响应对象具有类ActionDispatch::TestResponse。但是下面这行 should work officially 不起作用:

page.should have_selector "div.some_class"

页面对象具有类Capybara::Session。在哪些情况下必须使用response.body 对象,何时必须使用page 对象?

【问题讨论】:

    标签: ruby-on-rails-3 rspec2 capybara


    【解决方案1】:

    所以我遇到了类似的情况,我认为这是怎么回事:

    这取决于您未在此处包含的访问页面的代码。我正在写一个 rspec 请求规范。

    如果我用 rspec 自己检索页面:

    get '/some/path'
    

    然后 response.body.should have_selector 像你说的那样工作,但 page.should 没有。

    要使 Capybara 的“页面”正常工作(并使 Capybara 交互(如 click_button 或 fill_in)正常工作),您需要使用 Capybara 的“访问”进行检索,而不是使用 rspec 的“获取”进行检索:

    visit '/some/path'
    page.should have_selector("works")
    

    'page',一种 capybara 方法,只有在使用 'visit',一种 capybara 方法时才会被设置。

    这确实让人感到困惑,所有涉及到 Rails 测试的不同库的混合和匹配。

    【讨论】:

    • 优秀的答案。这就是区别。如果你使用 rspec 的 get "/some/path",那么 response.body 包含结果页面,你可以使用 response.body.should have_selector。如果你 Capybara 的访问“/some/path”,那么 page.body 包含结果页面,你可以使用 page.should have_selector。
    • 上述修复对我不起作用 - 我在访问时仍然遇到同样的错误......你说得对,这真是令人困惑:-)
    【解决方案2】:

    当你想使用标准的 rails 方法时,你可以使用response。另外,当您想使用 capybara 方法时,您可以使用 page。在 capybara 中,您很可能在给出的示例中使用 have_css

    【讨论】:

    • 没关系,我没有意识到 capybara 有一个 have_selector 方法。但答案仍然存在,page 代表水豚,response 代表轨道。
    • 但是为什么“page.should something”不起作用?我们在 Rails 3 应用程序中使用 require "capybara/rspec" 和 require "capybara/rails",但 "page.should .." 在 RSpec 请求测试中不起作用。
    • 我希望我知道。似乎混合 RSpec 和 Capybara 语法会导致一些问题。我知道page.body has_content? 对我有用,而page.should have_content 很少这样做。
    • 我已经开始到处使用page.should have_xpath了。
    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多