18

升级到 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

任何建议如何调试它?

4

4 回答 4

14

遇到同样的错误,但必须以不同的方式解决它,因为请求规范中的帖子不接受 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
于 2021-02-10T09:38:37.880 回答
6

上面的任何东西都对我不起作用,但我找到了另一种解决方案。

在工厂里改变了这个:

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

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

于 2021-07-24T12:35:47.147 回答
2

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 维护人员实际解决问题的方式。截至本文发布之日,该补丁尚未发布。

于 2021-03-06T17:10:54.793 回答
0

更改为 file_fixture 后,它工作得很好 relishapp.com/rspec/rspec-rails/v/3-8/docs/file-fixture

于 2021-01-23T16:03:03.257 回答