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

时间:2019-04-18 21:30:59

标签: ruby-on-rails selenium-webdriver capybara circleci

我具有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('$1,000.00') # failing here

1 个答案:

答案 0 :(得分:1)

all的行为会有所不同,具体取决于您使用的是当前版本的Capybara还是较旧的2.x版本。在当前版本中,all将等待Capybara.default_max_wait_time秒,直到任何匹配的元素出现,否则,它将返回一个空数组(实际上是类似于Result对象的Array,但足够接近)。在2.x all(默认情况下)中,没有等待匹配的元素,如果没有匹配的元素,它将仅返回空数组。不管哪种方式-您都找不到任何匹配的元素,然后在空数组上调用last-给您nil

有两种解决方法。您可以告诉all,您希望至少有一个匹配元素(然后将强制等待匹配元素Capybara 2.x)

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

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

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

避免了在Capybara元素上调用方法并在其上使用通用RSpec匹配器(出于测试稳定性的原因,除非您没有其他选择,否则您不希望这样做)。这两种解决方案不能测试完全相同的东西,但是可以针对您想要的进行足够的测试。根据您HTML的确切结构,可能还会有更有效的解决方案。

如果您已经在使用最新版本的Capybara,则您的错误将表明您期望在页面上显示的内容不是(也许您在错误页面上,等等),或者您没有{ {1}}设置得足够高,适合您正在测试的系统。