【问题标题】:Factory with carrierwave upload field [duplicate]带有载波上传字段的工厂[重复]
【发布时间】:2011-05-13 10:51:57
【问题描述】:

你好,我需要为我的模型建立工厂,例如

Factory.define :farm do |f|
  f.name { Factory.next :name }
  f.harvest '3'
  f.offers 'Random'
  f.latitude '43'
  f.longitude '-70'
  f.about 'We rocks!'
  f.logo { Factory.next :logo } # this doesn't work
end

现在我只是将字符串“#{n}.jpg”传递到我的徽标字段中,这不起作用,如何评估这个字段?我使用 CarrierWave 进行上传。

【问题讨论】:

标签: ruby-on-rails rspec factory-bot carrierwave


【解决方案1】:

您需要在您的工厂 (Rails 3) 中包含 ActionDispatch::TestProcess,并使用 fixture_file_upload 助手:

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :image do
    title "Example image"
    file { fixture_file_upload("files/example.jpg", "image/jpeg") }
  end
end

另外一定要在test/fixtures/files/example.jpg创建一个示例文件,否则你会得到文件不存在的错误。

【讨论】:

  • 在单元测试期间依赖外部文件的存在似乎有点糟糕。无论如何要完全存根或封装文件?
  • 拥有一个测试夹具文件并没有什么可怕的。只要您将其签入源代码控制,它就会一直在那里运行您的测试。
  • 是的,可怕的是夸张,对不起。只是想知道是否有替代方案。
【解决方案2】:

如果你不想包含ActionDispatch::TestProcess,你可以添加这样的文件,

Factory.define :brand do |f|
  f.name "My Brand"
  f.description "Foo"
  f.logo { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec', 'support', 'brands', 'logos', 'logo_image.jpg')) }
end

然后只在给定路径中包含文件,在这种情况下它将是spec/support/brands/logos/logo_image.jpg

这就是他们建议在他们的 wiki 上这样做的方式 https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Use-test-fixtures

【讨论】:

  • 你应该使用 Rack::Test::UploadedFile,因为强参数不会传递文件类型。
  • 感谢 sheerun,我已将其从 file.open 改为使用 Rack::Test::UploadedFile.new
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多