0

我正在使用 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 只是试图暂时解决问题,但这似乎很愚蠢,试图查明问题何时引入,而每天都在运行的现有测试用例从未中断。

谁能告诉我为什么一个有效而另一个失败?以下是这两个测试用例的共同点:

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

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

如果做不到这一点,有谁知道我如何将事物分开,以便页面对象需要capybara但不需要rspec,而规范文件需要rspec但不能capybara防止冲突?我对 Ruby 包管理了解不多,但似乎为了运行使用页面对象的 rspec 测试用例,所有这些都将混合在一起。我不确定避免同时要求它们的方法。

如果做不到这一点,有谁知道我理论上可以使用这两个软件包的哪个版本来避免这个问题?我用 rspec 3.2 和 capybara 2.4 做了实验,但似乎都不起作用,我放弃了,因为我记得无论我回到多远,我已经编写的测试用例都运行良好,而且试图以这种方式解决它似乎很愚蠢。

4

2 回答 2

0

不是最好的方法,但您可以修改 SitePrism::Page 类。在这里,您将 'all' 替换为 'page.all':

SitePrism::Page.class_eval do
  def find_all(*find_args)
    page.all(*find_args)
  end
end
于 2015-10-09T07:41:41.330 回答
0

在 Rspec 之后需要 capybara 或始终调用 page.all 而不是 all

于 2015-10-05T23:19:52.207 回答