功能规范在本地通过但在 Circle 上失败 CI

Feature spec pass locally but fail on Circle CI

我有我的 ActiveAdmin 视图的功能规范。它适用于我的本地机器。但是当 运行 在 CircleCi 中时它失败了

undefined method `text' for nil:NilClass

规格

it 'uses the update_at date when prepaid_invoice' do
  travel_to(5.days.ago) { create_prepayment }

  travel_to(3.days.ago) do
    visit '/admin/payments'

    expect(page).not_to have_css('.col.col-created > div')
    amount = all('.col-amount').last
    expect(amount.text).to eq(',000.00') # failing here

all 的行为会有所不同,具体取决于您使用的是当前版本的 Capybara 还是较早的 2.x 版本。在当前版本中,all 将最多等待 Capybara.default_max_wait_time 秒以等待任何匹配元素出现,如果 none 这样做,它将 return 一个空数组(实际上是像 Result 对象一样的数组,但足够接近)。在 2.x all (默认情况下)没有等待匹配元素,如果没有元素匹配,它只会 return 空数组。无论哪种方式 - 你都没有找到任何匹配的元素,然后在一个空数组上调用 last - 给你 nil.

有几种解决方法。你可以告诉 all 你期望至少一个匹配元素(这将强制等待匹配元素 Capybara 2.x )

amount = all('.col-amount', minimum: 1).last

或者根据您要检查的内容,您可以将其合并为一个

expect(page).to have_css('.col-amount', exact_text:',000.00')

避免在 Capybara 元素上调用方法并在其上使用通用 RSpec 匹配器(出于测试稳定性原因,这是你不想做的事情,除非你没有其他选择) .这两种解决方案不会测试完全相同的东西,但可能足以满足您的需求。根据您的 HTML 的具体结构,可能还有更有效的解决方案。

如果您已经在使用最新版本的 Capybara,那么您的错误将表明您希望页面上出现的内容不是(也许您在错误页面上,等等)或者您没有Capybara.default_max_wait_time 为您正在测试的系统设置足够高的值。