升级到 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
我希望这对任何人都有用。
升级到 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
我希望这对任何人都有用。