我该如何解决这个capybara / rspec命名冲突?

时间:2015-10-05 21:02:48

标签: ruby rspec capybara site-prism

我正在使用Capybara(实际上是SitePrism,使用Capybara)编写一个新的rspec测试用例,并且我遇到了一个明显已知的问题:https://github.com/jnicklas/capybara/issues/1396。基本上,由于一个或另一个的变化,RSpec和Capybara现在都有名为all的方法,当我尝试使用SitePrism来查找一组元素或SitePrism部​​分时,Capybara调用错误的方法并返回某种类型RSpec::Matchers::BuiltIn::All而不是预期的Capybara或SitePrism对象数组。

出于某种原因,我所有的旧测试,包括许多使用sectionselements构造非常相似的测试,都可以正常工作。我很难找到他们之间的差异,这会导致一个失败而另一个失败。我曾短暂地试图回滚Capybara或RSpec,试图让问题暂时消失,但这似乎很愚蠢,试图找出问题何时引入,当时每天运行的现有测试用例都没有破坏。 / p>

任何人都可以告诉我为什么一个有效而另一个无效?以下是这两个测试用例的共同点:

  1. 两个规范文件都需要相同的spec_helper.rb文件。
  2. spec_helper.rb文件包含require rspecrequire capybara
  3. 每个规范文件都使用require_relative来要求每个测试中使用的页面对象。
  4. 每个页面对象文件都有sections :table_rows, <SECTION CLASS>, <ROW CSS>声明。它们可能有不同的名称,类和CSS选择器,但它们是相同的基本构造。
  5. 在每个spec文件中,在引用table_rows
  6. 的页面对象上调用方法

    在其中一个较旧的测试用例中引用table_rows的工作正常,但我在新的测试用例中遇到名称冲突错误。任何人都知道为什么会这样,所以我可以修复新的测试用例?

    如果不这样做,是否有人知道如何分隔内容以使页面对象需要capybara而不是rspec且规范文件需要rspec但不需要capybara来防止碰撞?我不太了解Ruby包管理,但似乎为了运行一个使用页面对象的rspec测试用例,它们都将混合在一起。我不确定是否有办法避免要求他们两人。

    失败,是否有人知道我理论上可以使用这两个版本中的哪一个来避免这个问题?我做了rspec 3.2和capybara 2.4的实验,似乎都没有用,我放弃了,因为我记得无论我走多远,我已经写过的测试用例都运行良好,尝试以这种方式解决它似乎很愚蠢。

2 个答案:

答案 0 :(得分:0)

在Rspec之后要求capybara或总是调用page.all而不是全部

答案 1 :(得分:0)

不是最好的方法,但你可以修补SitePrism :: Page类。在这里你用'page.all'替换'all':

SitePrism::Page.class_eval do
  def find_all(*find_args)
    page.all(*find_args)
  end
end