使用FactoryGirl的attributes_for和Paperclip附件

Und*_*ion 4 ruby ruby-on-rails paperclip ruby-on-rails-4 factory-bot

我有一个叫做PhotoPaperclip附件的模型叫做image.

我有工作规格测试创建带附件的新照片,并可以手动创建它们.

我在我的规格中使用了以下FactoryGirl工厂:

FactoryGirl.define do
 factory :photo do
    image { File.new(File.join(Rails.root, 'spec', 'fixtures', 'images', 'minimum.jpg')) }
    # Other attributes omitted
 end
end
Run Code Online (Sandbox Code Playgroud)

我需要使用attributes_for(:photo)生成属性来传递给PhotoController的创建操作,但这样做会导致Paperclip引发错误:

Paperclip::AdapterRegistry::NoHandlerError:
       No handler found for "#<File:0x007f87c0a1d980>"
Run Code Online (Sandbox Code Playgroud)

我可以看到,如果我使用浏览器创建一个新的照片,该image属性如下所示:

"image"=>#<ActionDispatch::Http::UploadedFile:0x007fbc480b1c18 @tempfile=#<Tempfile:/var/folders/bv/x495g9g10m7119680c9ssqmr0000gn/T/RackMultipart20140622-45603-a1h9a8>, @original_filename="equals_cover_art_old.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photo[image]\"; filename=\"equals_cover_art_old.jpg\"\r\nContent-Type: image/jpeg\r\n">}
Run Code Online (Sandbox Code Playgroud)

但是生成的图像属性attributes_for(:photo)如下所示:

:image=>#<File:/Users/me/Documents/Work/Websites/example/spec/fixtures/images/minimum.jpg>
Run Code Online (Sandbox Code Playgroud)

如何通过调用attributes_for(:photo)或解决它来生成正确的对象?

Kir*_*rat 7

作为解决方法,您可以将image属性设置为Rack :: Test :: UploadedFile实例而不是File.

FactoryGirl.define do
  factory :photo do
    image Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/images/minimum.jpg", "image/jpg")
    # Other attributes
  end
end
Run Code Online (Sandbox Code Playgroud)