如何使用工厂女生生成回形针附件?

我有模型人有很多图像,其中图像有一个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 

我一直在使用下面的要点代码:

Rails 2

http://gist.github.com/162881

Rails 3

https://gist.github.com/313121

文件{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对象。