Have_selector завершается неудачно в тесте RSpec, но страница отображается правильно и тег присутствует - PullRequest
2 голосов
/ 14 марта 2011

Я пробираюсь по учебнику Rails Tutorial от Hartl, и я полностью застрял на одном из тестов. Тест (справа от книги) очень прост:

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"><br> <h1> <img alt="Steve T" class="gravatar" src="http://gravatar.com/..." /> Steve T </h1> </section>

Я даже могу добавить вызов: print response.body в спецификации контроллера, и он будет правильно выводить теги.

Есть идеи, что я могу делать не так?

ОБНОВЛЕНИЕ - Похоже, мы определили потенциально важный элемент: HTML-код в сообщении об ошибке теста rspec не содержит тега 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 ]

8 голосов
/ 17 августа 2011

У меня была похожая проблема при работе с Rails Tutorial.Я забыл включить 'render_views' под верхним оператором 'description', что привело к сбою теста 'have_selector'.

3 голосов
/ 30 сентября 2012

Мое решение заключалось в установке capybara , включите в свой Gemfile

group :development do
 gem 'capybara'
end

, затем выполните

bundle update
bundle install

, чем измените свой код на

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

Теперь запустите ваши тесты.Должно работать

1 голос
/ 27 марта 2011

Оказывается, что синтаксическая ошибка в партиале, загружающем мои таблицы стилей, по существу закомментировала все содержимое тега body. Вопрос в том, почему Firefox 3 все равно рендерил HTML. Я действительно решил эту проблему непреднамеренно, обновившись до Firefox 4. В Firefox 4 тело страницы не отображалось, и инструменты отладки привели меня к ошибочной разметке

1 голос
/ 14 марта 2011

Тест не пройден, потому что 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
...