升级到 ruby 3 和 rails 6.1 后未定义的方法“file_fixture_path”

undefined method `file_fixture_path' after upgrade to ruby 3 and 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

有什么调试建议吗?

改成file_fixture后就可以正常使用relishapp了。com/rspec/rspec-rails/v/3-8/docs/file-fixture

运行 陷入同样的​​错误,但不得不以不同的方式解决它,因为请求规范中的 post 不接受 file_fixture.[=12= 返回的对象]

在我的请求中包含 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 维护者实际上 fixed 就是这个问题。截至本post发布之日,补丁尚未发布。

以上任何方法对我都不起作用,但我找到了另一个解决方案。

在出厂时更改为:

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

我希望这对任何人都有用。