2013-10-22 10 views
11

In einem Rails-3.2.14-App mit Ruby-2, mit rspec-Schienen 2.14.0 und Capybara 2.1.0 folgendes Merkmal spec einen Fehler verursacht:Capybara/RSpec 'have_css' Matcher nicht funktioniert, aber has_css tut

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 

die Fehlermeldung lautet:

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. 

Das Titelelement und korrekter Text ist auf der gerenderte Seite

Aber wenn ich ändern Sie diese Zeile in der Feature-spec:

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

dazu:

page.has_css?('title', text: "Todo") 

dann der Test bestanden. [Edit - aber siehe Antwort unten von @JustinKo, dass dieser Test kein guter Test ist, wie es immer passieren wird]

Wie bekomme ich das have_css(...) Formular zu arbeiten? Ist es ein Konfigurationsproblem?

Hier ist der relevante Teil meiner Gemfile:

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

Und mein spec/spec_helper.rb ist wie folgt aufgebaut:

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 

Wer weiß, was ich tun könnte falsch sein?

+0

bitte gehen Sie vor und diesen Beitrag lesen, vor allem das Capybara Teil http://nofail.de/2013/10/debugging -rails-applications-in-development/ – phoet

+0

Wenn du nur 'page.has_css '(' title ', text:" Todo ") machst, wird der Test immer bestanden. 'has_css?' gibt einfach wahr oder falsch zurück, was nicht ausreicht, um einen Test zu beenden. Wenn Sie es ausgeben, werden Sie wahrscheinlich sehen, dass es falsch ist. Sind Sie sicher, dass die Seite ein Titelelement mit Text enthält? –

+0

@JustinKo Vielen Dank für den Hinweis auf den Newbie-Fehler. Ja, der Titel wird mit dem entsprechenden Text angezeigt - im Browser überprüft. –

Antwort

16

Standardmäßig sucht Capybara nur nach "sichtbaren" Elementen. Das Kopfelement (und sein Titelelement) werden nicht wirklich als sichtbar angesehen. Dies führt dazu, dass das Titelelement in have_css ignoriert wird.

Sie können Capybara zwingen, auch nicht sichtbare Elemente mit der Option :visible => false zu berücksichtigen.

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

Allerdings wäre es einfacher, die have_title Methode zu verwenden:

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

Danke - 'have_title' funktioniert :). Ich folgte einem Tutorial, das die 'have_css'-Methode verwendete, die für sie (auf dem Video) funktionierte, aber vielleicht lag es daran, dass sie eine ältere Version von Caypbara verwendeten, und vielleicht wurde' has_css' als veraltet eingestuft. Ich sehe, dass "have_title" weder in der [Capybara matchers-Dokumentation] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers) noch in den RSpec-Dokumenten aufgeführt ist Ich kann sehen, was das Leben ein bisschen komplizierter macht, den Kopf um diese Dinge zu legen, als jemand, der neu in der Aufgabe ist. –

+0

'have_title' ist in den rdocs - siehe http: // rubydoc.info/github/jnicklas/Capybara/Meister/Capybara/RSpecMatchers. –

+0

Danke für den Kopf - sehr hilfreich. Mir war nicht klar, dass es für RSpec einen separaten Matcher-Bereich gab - das ist kein offensichtlicher Unterschied. Obwohl man sich die Docs anschaut, während die "have_' matchers" da sind, hat keiner eine Erklärung gegen sie, was es immer noch schwierig macht! –