4

我似乎在 capybara 的 page 方法和 Kaminari 的 page 方法之间存在某种冲突。

这就是我的猜测,无论如何,这是错误:

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”方法添加到 Object 范围,但是随着 Kaminari 将其page方法添加到 ActiveRecord::Base (如果我没记错的话)它应该覆盖 Capybara 的方法。

我没有看到有人遇到这种麻烦,怎么可能?

谢谢。

4

2 回答 2

3

我对 Capybara 2.x 有同样的问题

我的功能规格在spec/feature directory. 我通过阅读 Capybara 文档意识到,如果您使用 features 目录,则无需将其包含Capybara::DSL在您的目录中。spec_helper它已经包括在内。

include Capybara::DSL如果您在其中会给出一个警告spec_helper,它会污染全局命名空间,这正是为什么这是一个坏主意!

查看 Capybara 上的这个 rspec-rails 页面了解详细信息

于 2013-11-15T15:22:44.433 回答
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 将它包含在“组”中,但是我相信这是它放入 Object 的地方。

这里的解决方案可能只是更改 Capybara 中方法的名称,但我想这不是我愿意做出的决定:)

于 2012-09-21T03:33:18.407 回答