2015-10-05 89 views
0

我正在使用水豚(SitePrism其实,它使用水豚)写一个新的rspec测试案例,我遇到了一个显然已知的问题:https://github.com/jnicklas/capybara/issues/1396。实质上,由于其中一个或另一个的变化,RSpec和Capybara现在都有名为all的方法,并且当我尝试使用SitePrism查找一组元素或SitePrism节时,Capybara调用错误的方法并返回某种类型的RSpec::Matchers::BuiltIn::All而不是预期的水豚或SitePrism对象。我该如何解决这个水豚/ rspec命名冲突?

出于某种原因,我所有的旧测试,包括许多非常类似的使用sectionselements构造,都非常好。我很难找出它们之间的差异,从而导致一个失败和另一个成功。我简单地尝试回滚Capybara或RSpec,试图让问题暂时消失,但它似乎很愚蠢,试图找出何时引入问题,以及每天运行的现有测试案例何时不会中断。

任何人都可以告诉我为什么一个工程,另一个失败?以下是这两个测试用例的共同之处:

  1. 这两个spec文件都需要相同的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的页面对象上调用方法。

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

做不到这一点,没有人知道,这样的页面对象需要capybara但不rspec和规范文件要求rspec我如何分开的东西,但不是capybara防止碰撞?我对Ruby包管理知之甚少,但似乎为了运行一个使用页面对象的rspec测试用例,它将被混合在一起。我不确定一种避免要求他们两个的方法。

失败,有没有人知道我理论上可以使用这两个包中的哪一个版本来避免这个问题?我使用rspec 3.2和水豚2.4进行了实验,似乎都没有工作,我放弃了,因为我记得无论我走多远,我已经写好的测试用例都能正常工作,试图用这种方式来解决它似乎很愚蠢。

回答

0

需要水豚Rspec的后或随时拨打page.all而不仅仅是所有

+0

我已经试过改变require的顺序了,它没有什么区别。另外,如果顺序很重要,并且我为两个测试使用了相同的'spec_helper'来需要这两个包,为什么它只与一个测试用例工作,而不是另一个? 至于'page.all',不幸的是我没有直接调用'all'方法。它由SitePrism的'elements'和'sections'构造调用。 再一次,有了像这样的建议修复,我真正困惑的是为什么一个测试工作正常,另一个测试失败,几乎完全相同的结构。 –

+0

你有没有从其调用#all的不正确版本的地方进行堆栈跟踪?你也说它是“几乎完全相同的结构” - 最后的差异是什么,需要“差不多” –

0

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

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