has_selector在RSpec测试中失败,但页面呈现正确并且标记存在

时间:2011-03-13 21:07:25

标签: ruby-on-rails rspec webrat

我正在通过Hartl的Rails Tutorial一书,我完全坚持其中一项测试。测试(从书中直接)非常简单:

require 'spec_helper'
describe UsersController do
render_views
describe "GET 'show'" do
    before(:each) do
        @user = Factory(:user)
    end
    ...
    it "should include the user's name" do
        get :show, :id => @user
        response.should have_selector('h1', :content => @user.name)
    end
end

测试失败,出现以下错误:

UsersController GET 'show' should include the user's name Failure/Error: response.should have_selector('h1', :content => @user.name) expected following output to contain a <h1>Steve T</h1> tag:...

页面在浏览器中正确呈现。这是从浏览器呈现的HTML源中剪切的:

<section class="round">
<h1> <img alt="Steve T" class="gravatar" src="http://gravatar.com/..." /> Steve T </h1> </section>

我甚至可以在控制器规范中添加对print response.body的调用,它会正确输出标记。

关于我可能做错的任何想法?

UPDATE - 好像我们已经确定了一个可能很重要的项目:rspec测试失败消息中的HTML缺少body标记内的所有内容。

1) UsersController GET 'show' should include the user's name Failure/Error: response.should have_selector('h1', :content => @user.name) expected following output to contain a <h1>Steve T</h1> tag: <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Ruby on Rails Tutorial Sample App | Steve T</title> </head></html> # ./spec/controllers/users_controller_spec.rb:33:in block (3 levels) in <top (required)>'

有人知道为什么,如果浏览器中的页面包含<body>标记和内部内容,并且print response.body显示内容,为什么错误消息会跳过它?

4 个答案:

答案 0 :(得分:8)

在使用Rails教程时遇到了类似的问题。我忘了在顶层'describe'语句下面加入'render_views',导致'have_selector'测试失败。

答案 1 :(得分:3)

我的解决方案是安装capybara, 包含在你的Gemfile中

group :development do
 gem 'capybara'
end

然后做

bundle update
bundle install

将代码编辑为

response.body.should have_selector('h1', :content => @user.name)

现在运行您的测试。它应该工作

答案 2 :(得分:1)

测试失败,因为h1缠绕在<img />上,因此内容不正确且测试失败。

你可以这样做:

it "should include the user's name" do
    get :show, :id => @user
    response.should have_selector('h1')
    response.body.should contain(@user.name);
end

答案 3 :(得分:1)

事实证明,加载我的样式表的partial中的语法错误实质上是注释掉所有body标签内容。问题是为什么Firefox 3无论如何都会渲染HTML。我实际上是通过升级到Firefox 4无意中解决了这个问题。在Firefox 4中,页面主体没有渲染,调试工具导致我错误的标记