10

我正在研究 ruby​​.railstutorial.org/ruby-on-rails-tutorial-book。我正在使用 rails 3.2.7、spork、rspec、capybara、launchy 和一些警卫 :)

我在第 3 章中遇到了一个非常奇怪的测试问题:

似乎测试不适用于<head>-Tag 内的内容。如果我将<title>-tag 放在<body>-tag 而不是 head-tag 内,它可以正常工作。当我将-tags 放在内部<h1>-Tags 上方时,它也可以工作。这很奇怪,不是吗?<title><head>

请帮我弄清楚。

该示例来自: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)静态页面主页应该有标题'Home'失败/错误:page.should have_selector('title', :text => '| Home') Capybara::ExpectationNotMet: expected to find css "title" with text " | Home”,但没有匹配项。还找到了“”,它匹配选择器但不是所有过滤器。# ./spec/requests/static_pages_spec.rb:15:in `block (3 levels) in '

那个正在工作:

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="http://railstutorial.org/">Ruby on Rails Tutorial</a>
  sample application
</p>

</body>
</html>

谢谢

编辑:您可以在 github 上找到我正在使用的文件: https ://github.com/farukg/sample_app/

规范文件的链接: https ://github.com/farukg/sample_app/blob/master/spec/requests/static_pages_spec.rb

我所做的解释:主页的代码就像它应该的那样。about 页面的代码有自己的布局,在 title-tag 上方有一个 h1-tag,表明它出于某种原因可以工作。最后,帮助页面在正文标签内有它的标题标签,它也可以工作。

我很困惑,为什么我会有这么奇怪的行为?

守卫的完整输出:

> 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.
4

6 回答 6

7

只是因为<title><head>里面所以它没有出现。

使用它,解决了我的问题:

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

提示:您可以应用相同的方法来检查其他<head>元素,<meta>例如,以确保您(并且您会一直)对 Google 友好。

于 2013-07-13T06:12:12.057 回答
6

我刚刚在 Github 上查看了你的项目,看来你使用的是 capybara 的边缘版本:

宝石文件

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 以使用 edge 版本后完全崩溃了)

因此,除非您热衷于帮助Capybara 2的 beta 测试,否则您最好坚持使用此处列出的 1.1.2 版本。

于 2012-08-01T02:57:45.377 回答
5

如果您使用的是 Capybara 2,则可以使用如下have_title方法:

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

于 2013-06-19T13:00:17.240 回答
0

在推迟了这么久之后,这对我来说也是新的。感谢stackoverflow,我能够在描述之后立即在规范文件顶部使用render_views修复一些测试。我从

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

但是在没有使用布局的情况下,我得到了这个错误:text Capybara::ExpectationNotMet: expected to find css "title" with text "Home | Ruby on Rails Tutorial Sample App" 但没有匹配项。但除此之外,在 gem 文件中使用 gem 'capybara', '1.1.2' 之后,我的测试通过了。但我也在路线中使用 get 'home' 作为动作匹配。我希望这有帮助。

于 2013-02-09T13:13:27.623 回答
0

你能用这个测试吗:

page.should have_selector('head title',
                          :text => "Ruby on Rails Tutorial Sample App | Home")
于 2012-07-30T17:42:27.137 回答
0

目前最简单的方法是从页面 html 访问 Title 元素,这将返回标题:

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" }
于 2012-11-29T11:44:42.757 回答