Capybara / RSpec'have_css'匹配器不工作但has_css没有

时间:2013-10-22 13:51:21

标签: rspec ruby-on-rails-3.2 capybara

在使用Ruby 2的Rails 3.2.14应用程序中,使用rspec-rails 2.14.0和capybara 2.1.0,以下功能规范导致失败:

require 'spec_helper'

feature 'View the homepage' do
  scenario 'user sees relevant page title' do
    visit root_path
    expect(page).to have_css('title', text: "Todo")
  end
end

失败消息是:

 1) View the homepage user sees relevant page title
 Failure/Error: expect(page).to have_css('title', text: "Todo")
 Capybara::ExpectationNotMet:
   expected to find css "title" with text "Todo" but there were no matches. Also
   found "", which matched the selector but not all filters.

呈现的网页上的标题元素和正确的文字

但是当我在功能规范中更改此行时:

expect(page).to have_css('title', text: "Todo")

到此:

page.has_css?('title', text: "Todo")
然后测试通过了。 [编辑 - 但请参阅以下来自@JustinKo的回复,该测试不是一个好的测试,因为它总是会通过]

如何让have_css(...)表单生效?这是配置问题吗?

以下是我Gemfile的相关部分:

group :development, :test do
  gem 'rspec-rails' 
  gem 'capybara'
end

我的spec/spec_helper.rb设置如下:

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rails'
require 'capybara/rspec'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

RSpec.configure do |config|

  # out of the box rspec config code ommitted

  config.include Capybara::DSL
end

任何人都知道我可能做错了什么?

1 个答案:

答案 0 :(得分:16)

默认情况下,Capybara只查找“可见”元素。头元素(及其标题元素)实际上并不可见。这导致在have_css中忽略title元素。

您可以强制Capybara通过:visible => false选项考虑不可见元素。

expect(page).to have_css('title', :text => 'Todo', :visible => false)

但是,使用have_title方法会更容易:

expect(page).to have_title('Todo')