RSpec 水豚:涉及 Ajax 的测试单独通过,但当 运行 一起时失败
RSpec capybara: Tests with Ajax involved pass in isolation but fail when run together
我知道之前有人问过这个问题,但我找不到与此问题类似的案例。
我有两个简单的测试:
# 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 请求,然后检查是否有一些数据填充到 table。然而,我没有操作数据库数据,我没有存储或试图从数据库中获取任何记录,只是一个基本的 Ajax 工作流程,它根据附加的文件呈现一些数据。
当我运行所有测试套件第一个测试通过,但第二个测试失败时,请检查两个测试是否具有相同的代码,所以我找不到解释。
当我 运行 隔离第二个测试时,它通过了。知道会发生什么吗?
更新
这里有一些额外的细节,上面只是一个例子,但是测试是不同的,我不得不删除第二个测试并将删除的部分添加到第一个测试中并且它通过了。
第二个测试是重复第一个测试的步骤,但是最后它单击了一个按钮,该按钮进行了另一个 AJAX 调用,呈现了一个 js.erb
视图文件。
这是我一开始遇到的错误:
Failure/Error:
respond_to do |format|
format.js
end
ActionController::UnknownFormat:
ActionController::UnknownFormat
然而,当我将第二个测试的断言和步骤移动到第一个测试时,一切都通过了。
顺便说一下,不确定是否与此问题有关,但我在测试文件的开头设置了 webdriver
Capybara.current_driver = :apparition
如果我删除上面的行,测试将失败,因为他们需要等待 ajax 请求的响应才能通过。
由于您的错误与请求的格式有关,我猜您希望所有测试都使用 js
启用的驱动程序 (selenium) 运行 但只是设置current_driver
到测试开始时的那个。在默认的 Capybara 设置中,对于 system/feature 规格,Capybara.current_driver
在每次测试结束时重置为 Capybara.default_driver
然后如果测试被标记为 js
它被设置为Capybara.javascript_driver
的值。如果你希望你的所有 system/feature 规格都 运行 使用相同的驱动程序,你可以设置 Capybara.default_driver = :chrome
(或你正在使用的任何驱动程序)否则你需要标记你想要的测试 运行 与具有 js
元数据的驱动程序
it 'second test example same instructions as above', js: true do
...
end
我知道之前有人问过这个问题,但我找不到与此问题类似的案例。
我有两个简单的测试:
# 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 请求,然后检查是否有一些数据填充到 table。然而,我没有操作数据库数据,我没有存储或试图从数据库中获取任何记录,只是一个基本的 Ajax 工作流程,它根据附加的文件呈现一些数据。
当我运行所有测试套件第一个测试通过,但第二个测试失败时,请检查两个测试是否具有相同的代码,所以我找不到解释。
当我 运行 隔离第二个测试时,它通过了。知道会发生什么吗?
更新 这里有一些额外的细节,上面只是一个例子,但是测试是不同的,我不得不删除第二个测试并将删除的部分添加到第一个测试中并且它通过了。
第二个测试是重复第一个测试的步骤,但是最后它单击了一个按钮,该按钮进行了另一个 AJAX 调用,呈现了一个 js.erb
视图文件。
这是我一开始遇到的错误:
Failure/Error:
respond_to do |format|
format.js
end
ActionController::UnknownFormat:
ActionController::UnknownFormat
然而,当我将第二个测试的断言和步骤移动到第一个测试时,一切都通过了。
顺便说一下,不确定是否与此问题有关,但我在测试文件的开头设置了 webdriver
Capybara.current_driver = :apparition
如果我删除上面的行,测试将失败,因为他们需要等待 ajax 请求的响应才能通过。
由于您的错误与请求的格式有关,我猜您希望所有测试都使用 js
启用的驱动程序 (selenium) 运行 但只是设置current_driver
到测试开始时的那个。在默认的 Capybara 设置中,对于 system/feature 规格,Capybara.current_driver
在每次测试结束时重置为 Capybara.default_driver
然后如果测试被标记为 js
它被设置为Capybara.javascript_driver
的值。如果你希望你的所有 system/feature 规格都 运行 使用相同的驱动程序,你可以设置 Capybara.default_driver = :chrome
(或你正在使用的任何驱动程序)否则你需要标记你想要的测试 运行 与具有 js
元数据的驱动程序
it 'second test example same instructions as above', js: true do
...
end