首页 > 解决方案 > RSpec capybara:涉及 Ajax 的测试单独通过但一起运行时失败

问题描述

我知道以前有人问过这个问题,但我找不到与这个问题类似的案例。

我有两个简单的测试:

# Helper function
def select_file(fixture = 'basic.csv')
    visit '/import-contacts'
    fixture_path = "#{Rails.root}/spec/fixtures"
    attach_file('file', "#{fixture_path}/#{fixture}")
  end


it 'first test example' do
    select_file
    click_button 'Import'

    ['Name', 'Date of Birth', 'Phone', 'Address', 'Credit Card', 'Email'].each do |file_column|
      expect(page).to have_content(file_column)
    end
end

it 'second test example same instructions as above' do
    select_file
    click_button 'Import'

    ['Name', 'Date of Birth', 'Phone', 'Address', 'Credit Card', 'Email'].each do |file_column|
      expect(page).to have_content(file_column)
    end
end

我只是将文件附加到文件字段并发送 ajax 请求,然后检查是否在表中填充了某些数据。但是,我没有操作数据库数据,我没有存储或尝试从数据库中获取任何记录,只是一个基本的 Ajax 工作流,它根据附加的文件呈现一些数据。

当我运行所有测试套件时,第一个测试通过,但第二个测试失败,请检查两个测试是否具有相同的代码,所以我找不到解释。

当我运行隔离的第二个测试时,它通过了。知道会发生什么吗?

更新 这里有一些额外的细节,上面只是一个例子,但是测试不同,我不得不删除第二个测试并将删除的部分添加到第一个测试中并且它通过了。

js.erb第二个测试是复制第一个测试的步骤,但是最后它单击了一个按钮,该按钮进行了另一个呈现视图文件的 AJAX 调用。

这是我一开始遇到的错误:

Failure/Error:
       respond_to do |format|
         format.js
       end
     
     ActionController::UnknownFormat:
       ActionController::UnknownFormat

但是,当我将第二个测试的断言和步骤移到第一个测试时,一切都通过了。

顺便说一句,不确定是否与此问题有关,但我在测试文件的开头设置了 webdriver

Capybara.current_driver = :apparition

如果我删除上述行,则测试失败,因为它们需要等待 ajax 请求的响应才能通过。

标签: ruby-on-railsajaxrspeccapybara

解决方案


由于您的错误与请求的格式有关,我猜您希望所有测试都使用js启用的驱动程序(硒)运行,但仅current_driver在测试开始时设置为该值。在默认 Capybara 设置中,对于系统/功能规范,在每次测试结束Capybara.current_driver时重置为Capybara.default_driver,然后如果测试被标记,js则设置为Capybara.javascript_driver. 如果您希望所有系统/功能规范使用您可以设置的相同驱动程序(或您正在使用的任何驱动程序)运行,否则您需要使用元数据Capybara.default_driver = :chrome标记您想要使用该驱动程序运行的测试js

it 'second test example same instructions as above', js: true do
  ...
end

推荐阅读