雷和水豚冲突(Kaminari and Capybara conflict)

2019-07-30 20:20发布

我似乎有某种水豚的页面方法和雷的页面方法之间的冲突。

这就是我猜到了,反正这里是错误:

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的(如果我没有记错),它应该覆盖水豚的一个。

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

谢谢。

Answer 1:

我曾与水豚2.X同样的问题

我的功能规格都在spec/feature directory 。 我从阅读的水豚文档,没有必要列入实现Capybara::DSLspec_helper如果您使用的功能目录。 它已经包括在内。

有给你一个警告, include Capybara::DSLspec_helper ,它会污染全局命名空间,这就是为什么这是一个坏主意!

看看这个RSpec的护栏上的水豚页的详细信息



Answer 2:

这是一个黑客的一点点,但我还是能解决该问题(其中水豚“污染”的对象空间)民主基金-ING在我的规格的方法:

# 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方法来源于水豚:: DSL
  2. 该水豚:: DSL方法纳入经RSpec中的#configure.include方法的对象类(见的lib /豚/ rspec.rb)。
  3. RSpec的则包括它进入“组”,但我相信这是它落入对象。

这里的解决方案可能只是改变水豚的方法的名字,但我想那不是一个决定,我愿意做:)



文章来源: Kaminari and Capybara conflict