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
我已追溯到这发生的地方,基本上:
- #page方法来自Capybara :: DSL
- Capybara :: DSL方法通过RSpec的#configure.include方法包含在Object类中(参见lib / capybara / rspec.rb)。
- 然后RSpec将它包含在’组’中,但我相信这是它落入Object的地方。
这里的解决方案可能只是改变Capybara中方法的名称,但我想这不是我愿意做出的决定:)