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.

Я надеюсь, что это кому-то поможет, мне и еще одному инженеру потребовалось пару дней, чтобы найти это решение.

Другие вопросы по тегам