我具有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
答案 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}}设置得足够高,适合您正在测试的系统。