Сломанные тесты контроллера после установки Capybara?

У меня была куча комбинированных тестов контроллера/представления, написанных с помощью rspec. Я добавил гем Capybara и написал несколько интеграционных тестов, которые проходят нормально. Единственная проблема в том, что теперь во всех моих тестах контроллера, где у меня есть

response.should have_selector("какой-то селектор")

rspec выдает такие ошибки, как:

NoMethodError:
       undefined method `has_selector?' for #<ActionController::TestResponse:0xa03e7ec>

когда я запускаю тесты контроллера. Я предполагаю, что Capybara используется в моих тестах контроллера и перезаписывает некоторые методы Rspec. Как я могу это исправить?

# gemfile.rb
group :test do
  gem 'rspec'
  gem "capybara"
  gem "launchy"
  gem 'factory_girl_rails', '1.0'
end

# spec_helper.rb
RSpec.configure do |config|
  config.include IntegrationSpecHelper, :type => :request
end

Вот пример неудачного теста:

# spec/controllers/books_controller_spec.rb
require 'spec_helper'

describe BooksController do
  render_views

  it "should have the right page title" do
    get :show, :id => @book.ean
    response.should have_selector("title", :content => "Lexicase | " + @book.title)
  end
end

и связанная с этим ошибка:

  1) BooksController GET 'show' should have the right page title
     Failure/Error: response.should have_selector("title", :content => "Lexicase | " + @book.title)
     NoMethodError:
       undefined method `has_selector?' for #<ActionController::TestResponse:0xa8488c0>
     # ./spec/controllers/books_controller_spec.rb:23:in `block (3 levels) in <top (required)>'

person David Tuite    schedule 22.03.2011    source источник
comment
Можете ли вы добавить свой провальный тест?   -  person shingara    schedule 22.03.2011


Ответы (2)


Вы, вероятно, использовали Webrat ранее, а has_selector? — это средство сопоставления Webrat. У Capybaras нет сопоставителя has_selector, у него есть сопоставитель под названием has_css. Вы можете заменить «has_selector» на «has_css».

person Rishav Rastogi    schedule 22.03.2011
comment
В любом случае, вы правы насчет Вебрата. Насколько я могу судить, есть has_selector? метод в Capybara (rubydoc.info/github/jnicklas/capybara/master/Capybara/), но это метод страницы, а не метод запроса. Другое дело, что я не думаю, что смогу использовать get:show больше, как мог бы с webrat. Вместо этого я должен использовать visit(book_path(@book.ean)) . Однако визит может выдавать запросы на получение только по дизайну, что делает его непригодным для модульных тестов контроллера. Здесь есть большая проблема, которую я упускаю. - person David Tuite; 22.03.2011
comment
лол, оказывается, Capybara и Webrat не исключают друг друга, как я изначально предполагал. Имхо проблема решена! - person David Tuite; 22.03.2011
comment
Я бы хотел, чтобы блоггеры перестали называть Capybara простой заменой Webrat или, по крайней мере, дополнили это заявление изменениями в вашем коде, которые могут потребоваться. Мне пришлось внести множество мелких изменений, чтобы мой код заработал после переключения. - person coder_tim; 23.03.2011
comment
Да, я тоже.. это не замена - person Rishav Rastogi; 23.03.2011

Помощники Capybara работают только в рамках спецификаций запросов. Либо создайте новую спецификацию запроса, либо передайте :type => :request в части блока описания, например:

describe "test for the testing test", :type => :request do
  it "should work with capybara" do
    visit root_path
    click_link "Home"
    page.should WHATEVA
  end
end

Я понимаю, что этот вопрос был задан давным-давно, но я все равно решил поделиться. ГЛХФ

person kalusn    schedule 27.08.2011