4

カピバラのページメソッドとカミナリのページメソッドの間には、ある種の矛盾があるようです。

とにかく、それは私が推測したものです、ここにエラーがあります:

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

ページネーションを削除すると、テストは正常に機能します。

これがどのように可能かわかりません。カピバラは「ページ」メソッドをオブジェクトスコープに追加していると思いますが、カミナリがそのpageメソッドを ActiveRecord::Base に追加すると (正しく思い出せば)、カピバラのメソッドをオーバーライドする必要があります。

この種の問題を抱えている人を見たことがありません。

ありがとう。

4

2 に答える 2

2

これはちょっとしたハックですが、仕様のメソッドを未定義にすることで、問題 (カピバラがオブジェクト空間を「汚染」する場所) を回避することができました。

# 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 メソッドは、RSpec の #configure.include メソッドを介して Object クラスにインクルードされます (lib/capybara/rspec.rb を参照)。
  3. RSpecはそれを「グループ」に含めますが、これがオブジェクトにドロップされる場所だと思います。

ここでの解決策は、カピバラでメソッドの名前を変更することかもしれませんが、それは私が喜んで行う決定ではないと思います:)

于 2012-09-21T03:33:18.407 に答える