undefined метод `file_fixture_path'после обновления до ruby 3 и rails 6.1
После обновления до ruby 3 и rails 6.1 мои тесты ломаются на линии
subject.avatar.attach(fixture_file_upload(Rails.root.join('spec', 'fixtures', 'images', 'avatar.jpg')))
с:
NoMethodError:
undefined method `file_fixture_path' for RSpec::Rails::FixtureFileUploadSupport::RailsFixtureFileWrapper:Class
Did you mean? fixture_path
стек ошибок указывает на
webmock-3.11.0/lib/webmock/rspec.rb:37
Есть предложения по его отладке?
5 ответов
После перехода на file_fixture он отлично работает relishapp.com/rspec/rspec-rails/v/3-8/docs/file-fixture
Все вышеперечисленное у меня не сработало, но я нашел другое решение.
На заводе изменили это:
photo { fixture_file_upload(Rails.root.join('spec/support/images/test_image.png'), 'image/png') }
к этому:
photo { Rack::Test::UploadedFile.new('spec/support/images/test_image.png', 'image/png') }
Но после этого я столкнулся с другой ошибкой:
unknown attribute 'service_name' for ActiveStorage::Blob
И решил это двумя командами:
rails active_storage:update
rails db:migrate
Надеюсь, это может быть кому-нибудь полезно.
Произошла та же ошибка, но пришлось решать ее по-другому, поскольку сообщение в спецификации запроса не принимает объект, возвращаемый file_fixture.
Включая
include ActionDispatch::TestProcess::FixtureFile
в моем запросе решил это за меня.
RSpec.describe "Attachments", type: :request do
include Rack::Test::Methods
include ActionDispatch::TestProcess::FixtureFile
#...
expect {
file = fixture_file_upload("image.jpg", "image/jpeg", :binary)
post collection_work_attachments_path(collection, work), {attachment: {file: file, name: image_name, visibility: [:admin]}}
}.to change(Attachment, :count).by(1)
#...
end
Добавление следующего инициализатора решает проблему без потенциальных побочных эффектов включения
ActionDispatch::TestProcess::FixtureFile
модуль.
# config/initializers/rspec.rb
module RSpec
module Rails
module FixtureFileUploadSupport
class RailsFixtureFileWrapper
class << self
attr_accessor :file_fixture_path
end
end
end
end
end
Это как проблема на самом деле фиксируются с помощью RSpec сопровождающих. На момент публикации патч еще не выпущен.
У меня была такая же проблема в течение долгого времени, и я продолжал приземляться на этот ответ SO. Моя проблема заключалась в том, что во многих моих спецификациях одна из моихFactoryBot
фабрики звонили, и ничто из предложенного здесь не решило проблему.
я вошел вActionDispatch
код и обнаружил, что вActionDispatch::TestProcess::FixtureFile
модуля, у фабричного объекта был запрошен егоfixture_path
атрибут, которого у него нет. Вот почему ответ @murb будет работать, если вашfixture_file_upload
находится в файле спецификаций, но не в заводском файле. Для меня ответ состоял в том, чтобы добавить следующий код вspec/support/factory_bot.rb
в моем проекте Rails:
FactoryBot::SyntaxRunner.instance_eval do
def fixture_path
File.absolute_path('spec/fixtures/files')
end
def file_fixture_path
'spec/fixtures/files'
end
end
Обратите внимание, что второй метод (file_fixture_path
) означает отключить предупреждение вActionDispatch::TestProcess::FixtureFile#fixture_file_upload
.
Я надеюсь, что это кому-то поможет, мне и еще одному инженеру потребовалось пару дней, чтобы найти это решение.