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

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

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

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

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

这就是我一开始的错误:

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

ActionController::UnknownFormat:
ActionController::UnknownFormat

然而,当我把第二次测试的部分和步骤移到第一次测试时,一切都通过了。

顺便说一句,我不确定是否与这个问题有关,但我在测试文件的开头设置了网络驱动程序

Capybara.current_driver = :apparition

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

由于您的错误与请求的格式有关,我猜您希望所有测试都使用启用了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

最新更新