RSpec capybara:涉及 Ajax 的测试单独通过,但一起运行时失败

Posted

技术标签:

【中文标题】RSpec capybara:涉及 Ajax 的测试单独通过,但一起运行时失败【英文标题】:RSpec capybara: Tests with Ajax involved pass in isolation but fail when run together 【发布时间】:2021-07-13 22:33:03 【问题描述】:

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

我有两个简单的测试:

# 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 工作流,它根据附加的文件呈现一些数据。

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

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

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

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

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

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

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

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

Capybara.current_driver = :apparition

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

【问题讨论】:

你得到的失败错误是什么? @ThomasWalpole 断言失败,我会在问题中添加更多细节 【参考方案1】:

由于您的错误与请求的格式有关,我猜您希望所有测试都使用启用 js 的驱动程序 (selenium) 运行,但只是在开始时将 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

【讨论】:

天哪,它成功了!太感谢了。看来我必须在我的spec/rails_helper.rb 中添加Capybara.default_driver = :apparition 规则才能成功!缺乏与水豚和这些网络驱动程序一起使用的文档真是太疯狂了......

以上是关于RSpec capybara:涉及 Ajax 的测试单独通过,但一起运行时失败的主要内容,如果未能解决你的问题,请参考以下文章

Capybara 无法识别 ajax 加载的元素。?

Rails Cucumber使用Capybara测试AJAX

使用 RSpec + capybara-webkit 检查 JS 框是不是存在

Rspec/Capybara 正在加载,循环要求被认为是有害的

在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”

使用 capybara 进行 rspec2 验收测试