Конфликт Каминари и Капибары

Кажется, у меня есть какой-то конфликт между методом страницы капибары и методом страницы Каминари.

Во всяком случае, это то, что я догадался, вот ошибка:

Failure/Error: before { sign_in_as user }
     ActionView::Template::Error:
       wrong number of arguments (1 for 0)
     # ./app/models/feed.rb:9:in `microposts'
     [Rest of the backtrace]

Пример кода:

class Feed
    def microposts(opts = { urgent: false })                                                                
      urgent = opts[:urgent]                                                                                
      p Microposts.where(id: 1).page # <Capybara::Session>                                                                         
      p Microposts.where(id: 1).page(1) # Error
    end
end

Если убрать нумерацию страниц, тест работает нормально.

Я не понимаю, как это возможно, я думаю, что Capybara добавляет метод "page" в область объекта, но поскольку Kaminari добавляет свой метод page в ActiveRecord::Base (если я правильно помню), он должен переопределить метод Capybara.

Я не видел ни у кого такой проблемы, как это возможно?

Спасибо.


person Gabriel Dehan    schedule 07.08.2012    source источник


Ответы (2)


У меня была такая же проблема с Capybara 2.x.

Мои спецификации функций находятся в файле spec/feature directory. Прочитав документацию Capybara, я понял, что нет необходимости включать Capybara::DSL в ваш spec_helper, если вы используете каталог функций. Он уже включен.

Существует предупреждение, если вы include Capybara::DSL в spec_helper, что это загрязнит глобальное пространство имен, и именно поэтому это плохая идея!

Подробности см. на этой странице rspec-rails на Capybara

person iNulty    schedule 15.11.2013

Это немного хак, но я смог обойти проблему (где Capybara «загрязняет» пространство объектов), отменив определение метода в моей спецификации:

# Capybara adds a 'page' method to the Object class which conflicts with the Kaminari scope
# Remove it here to allow things to work
Object.send :undef_method, :page

Я проследил, где это происходит, и по существу:

  1. Метод #page взят из Capybara::DSL.
  2. Метод Capybara::DSL включается в класс Object через метод RSpec #configure.include (см. lib/capybara/rspec.rb).
  3. Затем RSpec включает его в «группу», однако я считаю, что именно здесь он попадает в Object.

Решение здесь может заключаться в том, чтобы просто изменить имя метода в Capybara, но я думаю, что это не то решение, которое я готов принять :)

person Matthew Savage    schedule 21.09.2012
comment
Наконец-то я сменил Kaminari на will_paginate, но спасибо за понимание :) - person Gabriel Dehan; 11.10.2012