如何使用工厂女生生成回形针附件?
我有模型人有很多图像,其中图像有一个Paperclip附件字段称为数据,缩写版本显示如下:
class Person has_many :images ... end class Image has_attached_file :data belongs_to :person ... end
人员必须至less有一个图像附加到它。
使用FactoryGirl时,我的代码类似于以下内容:
Factory.define :image do |a| a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) } a.association :person end Factory.define :person do |p| p.first_name 'Keyzer' p.last_name 'Soze' p.after_create do |person| person.assets = [Factory.build(:image, :person => person)] end # p.images {|images| [images.association(:image)]} end
(NB我也试过上面的代码也试过了)大多数时候我运行黄瓜function的时候,出现类似如下的错误:
没有这样的文件或目录 – /tmp/stream,9887,0.png(Errno :: ENOENT)
…
有时testing运行成功。
任何人都可以告诉我什么问题是我在这里或他们如何使用FactoryGirl和Paperclip在一起,实现像我想要实现的东西?
我正在使用Rails 3。
你可以使用fixture_file_upload
在你的testing助手中include ActionDispatch::TestProcess
,这里是一个工厂示例:
factory :user do avatar { fixture_file_upload(Rails.root.join('spec', 'photos', 'test.png'), 'image/png') } end
在上面的例子中,运行testing之前, spec/photos/test.png
需要存在于应用程序根目录中。
较新的FG语法和否包括必要的
factory :user do avatar { File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')) } end
或者,更好的是,
factory :user do avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } end
在Pivotal实验室的Desmond Bowe build议避免由于内存泄漏问题造成的fixture_file_upload 。 相反,您应该直接在您的工厂设置回形针字段:
factory :attachment do supporting_documentation_file_name { 'test.pdf' } supporting_documentation_content_type { 'application/pdf' } supporting_documentation_file_size { 1024 } # ... end
文件{File.new(Rails.root.join('spec','fixtures','filename.png'))}
尝试使用ActionController :: TestUploadedFile。 您可以将文件属性设置为TestUploadedFile的一个实例,回形针应该照顾其余部分。 例如
valid_file = File.new(File.join(Rails.root, 'features', 'support', 'file.png')) p.images { [ ActionController::TestUploadedFile.new(valid_file, Mime::Type.new('application/png')) ] }
上面的答案在某些情况下可以提供帮助,而实际上这个答案在我的某个情况下是有帮助的,但是在使用Carrierwave时,这个问题以前的解决scheme这次没有解决。
第一个方法:
对于我来说,添加一个after :create
解决了我这样的问题:
after :create do |b| b.update_column(:video_file, File.join(Rails.root, 'spec', 'fixtures', 'sample.mp4')) end
设置内联video文件,如video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
没有解决,它报告错误。
第二种方法:
像这样定义一个工厂(把personal_file
改成你的附件名称):
FactoryGirl.define do factory :contact do personal_file { File.new("#{Rails.root}/spec/fixtures/personal_files/my_test_file.csv") } personal_file_content_type 'text/csv' end end
并将这些行添加到config/environemnts/test.rb
:
config.paperclip_defaults = { url: "#{Rails.root}/spec/fixtures/:attachment/:filename", use_timestamp: false }
你准确地testing了什么? 回形针将成功附加文件? 这看起来像回形针应该处理的testing,而不是你的应用程序。
你有没有尝试过
a.data { File.join(Rails.root, 'features', 'support', 'file.png') }
我们使用机械师,而不是factory_girl,只是使用像
Image.blueprint do image { RAILS_ROOT + 'spec/fixtureshttp://img.dovov.com001.jpg' } end
但是,当我们这样做的时候,我们并不是真正的testing,我们通常只想拥有一个有效的Image
对象。