Kaminari和Capybara冲突

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

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

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 #  p Microposts.where(id: 1).page(1) # Error end end 

如果我删除分页,测试工作正常。

我不明白这是怎么可能的,我猜Capybara将“页面”方法添加到Object范围,但是当Kaminari将其page方法添加到ActiveRecord :: Base时(如果我没记错),它应该覆盖Capybara的一个。

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

谢谢。

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

我的function规格位于spec/feature directory 。 我从阅读Capybara文档中spec_helper如果使用features目录,则无需在spec_helper包含spec_helper Capybara::DSL 。 它已经包括在内了。

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

有关详细信息,请查看Capybara上的此rspec-rails页面

这有点像黑客,但我能够通过在我的规范中取消方法解决问题(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方法通过RSpec的#configure.include方法包含在Object类中(参见lib / capybara / rspec.rb)。
  3. 然后RSpec将它包含在’组’中,但我相信这是它落入Object的地方。

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

Interesting Posts