Тестирование со спецификациями, capybara из главы 3 главы руководства не работает (has_selector ('title',: text => '| Home'))

im работает над ruby.railstutorial.org/ruby-on-rails-tutorial-book. Im, используя рельсы 3.2.7, spork, rspec, capybara, launchy и некоторые охранники:)

У меня есть действительно странная проблема в главе 3 с тестом:

Кажется, что тесты arent работают на то, что находится внутри <head> -Tag. Если я помещаю <title> -tag внутри <body> -tag вместо head-tag, он отлично работает. Также он работает, когда я помещаю <h1> -tags выше <title> внутри <head> -Tags. Это странно, не так ли?

Пожалуйста, помогите мне разобраться.

Пример: ruby.railstutorial.org/chapters/static-pages#code:title_test:

it "should have the right title" do
  visit '/static_pages/home'
  page.should have_selector('title',
                    :text => "Ruby on Rails Tutorial Sample App | Home")
end

Сообщение об ошибке:

Неудачи:

1) Статические страницы Домашняя страница должна иметь заголовок "Главная",      Ошибка/Ошибка: page.should have_selector ('title',: text = > '| Home')      Капибара:: ExpectationNotMet:        ожидал найти css "title" с текстом "Главная", но совпадений не было. Также найдено "", которое соответствовало селектору, но не всем фильтры.      #./spec/requests/static_pages_spec.rb:15:in `block (3 уровня) в '

Это работает:

it "should have the h1 'Sample App'" do
  visit '/static_pages/home'
  page.should have_selector('h1', :text => 'Sample App')
end

отображаемый HTML файл:

<!DOCTYPE html>
<html>
<head>
  <title>Ruby on Rails Tutorial Sample App | Home</title>
  <!-- some css,js stuff -->
</head>
<body>

<h1>Sample App</h1>
<p>
  This is the home page for the
  <a href="#" onclick="location.href='http://railstutorial.org/'; return false;">Ruby on Rails Tutorial</a>
  sample application
</p>

</body>
</html>

Спасибо

Изменить: вы можете найти файлы im, работающие с github: https://github.com/farukg/sample_app/

ссылка на файл спецификации: https://github.com/farukg/sample_app/blob/master/spec/requests/static_pages_spec.rb

Объяснение того, что я сделал: Код для Домашней страницы, как и должно быть. Код для страницы имеет свой собственный макет с h1-тегом над заголовком-тегом внутри, чтобы показать, что он работает по какой-то причине. И, наконец, страница справки имеет свой тег заголовка внутри тегов тела, который тоже работает.

Я совершенно смущен, почему у меня такое странное поведение?

полный выход охранника:

> Run all
Bundle already up-to-date
Running all specs
Running tests with args ["--drb", "--colour", "-f", "progress", "-r", "/home/faruk/.rvm/gems/ruby-1.9.3-p125/gems/guard-rspec-1.2.0/lib/guard/rspec/formatters/notification_rspec.rb", "-f", "Guard::RSpec::Formatter::NotificationRSpec", "--out", "/dev/null", "--failure-exit-code", "2", "spec"]...
..FFF.....Neues Fenster in aktueller Browsersitzung erstellt.
.FF..

Failures:

  1) Static pages Home page having application layout should have_selector head title 'Home'
     Failure/Error: page.should have_selector('head title',
     Capybara::ExpectationNotMet:
       expected to find css "head title" with text "Ruby on Rails Tutorial Sample App | Home" but there were no matches. Also found "", which matched the selector but not all filters.
     # ./spec/requests/static_pages_spec.rb:23:in `block (3 levels) in <top (required)>'

  2) Static pages Home page having application layout should have content 'Home'
     Failure/Error: page.should have_content("Ruby on Rails Tutorial Sample App | Home")
       expected there to be text "Ruby on Rails Tutorial Sample App | Home" in "Sample App This is the home page for the Ruby on Rails Tutorial sample application"
     # ./spec/requests/static_pages_spec.rb:30:in `block (3 levels) in <top (required)>'

  3) Static pages Home page having application layout should have css title 'Home'
     Failure/Error: page.should have_css("title", :text => "Ruby on Rails Tutorial Sample App | Home")
     Capybara::ExpectationNotMet:
       expected to find css "title" with text "Ruby on Rails Tutorial Sample App | Home" but there were no matches. Also found "", which matched the selector but not all filters.
     # ./spec/requests/static_pages_spec.rb:36:in `block (3 levels) in <top (required)>'

  4) Static pages about page with own layout should JUST have_selector head title 
     Failure/Error: page.should have_selector('head title')
     Capybara::ExpectationNotMet:
       expected to find css "head title" but there were no matches
     # ./spec/requests/static_pages_spec.rb:86:in `block (3 levels) in <top (required)>'

  5) Static pages about page with own layout should have_selector head title 'About Us'
     Failure/Error: page.should have_selector('head title',
     Capybara::ExpectationNotMet:
       expected to find css "head title" with text "Ruby on Rails Tutorial Sample App | About Us" but there were no matches
     # ./spec/requests/static_pages_spec.rb:93:in `block (3 levels) in <top (required)>'

Finished in 0.66215 seconds
15 examples, 5 failures

Failed examples:

rspec ./spec/requests/static_pages_spec.rb:20 # Static pages Home page having application layout should have_selector head title 'Home'
rspec ./spec/requests/static_pages_spec.rb:27 # Static pages Home page having application layout should have content 'Home'
rspec ./spec/requests/static_pages_spec.rb:33 # Static pages Home page having application layout should have css title 'Home'
rspec ./spec/requests/static_pages_spec.rb:83 # Static pages about page with own layout should JUST have_selector head title 
rspec ./spec/requests/static_pages_spec.rb:90 # Static pages about page with own layout should have_selector head title 'About Us'
Done.

> Neues Fenster in aktueller Browsersitzung erstellt.
Neues Fenster in aktueller Browsersitzung erstellt.

Ответ 1

Я только что проверил ваш проект на Github, и кажется, что вы используете граничную версию capybara:

Gemfile

gem 'capybara', :git => 'git://github.com/jnicklas/capybara.git'

Gemfile.lock

GIT
  remote: git://github.com/jnicklas/capybara.git
  revision: e561d249555195cdd0e9251246fc75aae876f833
  specs:
      capybara (2.0.0.beta2)
      mime-types (>= 1.16)
      nokogiri (>= 1.3.3)
      rack (>= 1.0.0)
      rack-test (>= 0.5.4)
      selenium-webdriver (~> 2.0)
      xpath (~> 1.0.0.beta1)

Если ничего другого, я бы осмелился сказать, что это причина вашей проблемы. (И, конечно, мой справочный проект разрушен на всем протяжении после обновления capybara, чтобы использовать реберную версию)

Итак, если вы не заинтересованы в бета-тестировании Capybara 2, вам следует придерживаться версии 1.1.2 как указано здесь.

Ответ 2

Это просто потому, что <title> находится в <head>, поэтому он не появляется.

Используя это, решила мою проблему:

page.should have_selector 'title', :visible => false

Совет. Вы можете применить это же, чтобы проверить другие элементы <head>, например <meta>, например, чтобы быть уверенным, что вы (и останетесь) дружественным к Google.

Ответ 3

Если вы используете Capybara 2, вы можете использовать метод have_title следующим образом:

page.should have_title("Ruby on Rails Tutorial Sample App | Home")

Ответ 4

Можете ли вы проверить это:

page.should have_selector('head title',
                          :text => "Ruby on Rails Tutorial Sample App | Home")

Ответ 5

На данный момент самый простой способ сделать это - получить доступ к элементу Title из страницы html, это вернет заголовок:

page.html.match(/<title>(.*)<\/title>/)[1].to_s

Не идеально, поскольку он использует регулярное выражение на html (!!), но будет работать. Вероятно, лучше всего написать вспомогательную функцию

# put in spec/support/utilities.rb
def page_title(page)
  page.html.match(/<title>(.*)<\/title>/)[1].to_s
end

тогда ваши тесты могут быть записаны как

page_title(page).should eq( "Ruby on Rails Tutorial Sample App | Home" }

Ответ 6

Это ново для меня тоже после долгого откладывания. Благодаря stackoverflow я смог исправить некоторые тесты с помощью render_views в верхней части спецификационного файла сразу после описания. Я получаю проходящие тесты от

 describe "GET 'home'" do
   it "returns http success" do
     get 'home'
     response.should be_success
 end

Но без использования макета я получаю эту ошибку для: text Капибара:: ExpectationNotMet: ожидали найти css "title" с текстом "Главная | Ruby on Rails Tutorial Sample App", но совпадений не было. Но помимо этого после использования gem 'capybara', '1.1.2' в файле gem мои тесты проходят. Но я также использую get 'home' как это в маршрутах как действие. Надеюсь, это поможет.