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

min*_*gle 15 ruby rspec ruby-on-rails ruby-on-rails-6.1 ruby-3

升级到 ruby​​ 3 和 rails 6.1 后,我的测试中断了

subject.avatar.attach(fixture_file_upload(Rails.root.join('spec', 'fixtures', 'images', 'avatar.jpg')))
Run Code Online (Sandbox Code Playgroud)

和:

NoMethodError:
        undefined method `file_fixture_path' for RSpec::Rails::FixtureFileUploadSupport::RailsFixtureFileWrapper:Class
        Did you mean?  fixture_path
Run Code Online (Sandbox Code Playgroud)

错误堆栈指向 webmock-3.11.0/lib/webmock/rspec.rb:37

任何建议如何调试它?

Rus*_*eev 21

上面的任何内容都不适合我,但我找到了另一个解决方案。

在工厂里改变了这一点:

photo { fixture_file_upload(Rails.root.join('spec/support/images/test_image.png'), 'image/png') }
Run Code Online (Sandbox Code Playgroud)

对此:

photo { Rack::Test::UploadedFile.new('spec/support/images/test_image.png', 'image/png') }
Run Code Online (Sandbox Code Playgroud)

但之后我遇到了另一个错误:

unknown attribute 'service_name' for ActiveStorage::Blob
Run Code Online (Sandbox Code Playgroud)

并用两个命令解决了这个问题:

rails active_storage:update
rails db:migrate
Run Code Online (Sandbox Code Playgroud)

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


mur*_*urb 11

遇到了同样的错误,但必须以不同的方式解决它,因为请求规范中的帖子不接受 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
Run Code Online (Sandbox Code Playgroud)

  • 我想我们已经更新了如何解决它https://github.com/rspec/rspec-rails/issues/2402#issuecomment-737625958。当前的方法可以解决,但是,它没有被占用(https://github.com/thoughtbot/factory_bot/issues/385#issuecomment-439040731) (2认同)