带回形针的夹具

我正在使用Paperclip存储文档,但我找不到如何创建它们的装置,我写道:

 File.open(Rails.root.join('spec', 'assets', 'image.png'))) %> : asset_file_name:  asset_content_type:  asset_file_size:  asset_updated_at:  documentable: party (Event) %>  

但是我运行它,文档存在于数据库中,但它没有存储。

我应该自己存储文件(写文件)吗? 或者还有其他方式吗?

你可以使用fixture_file_upload

 include ActionDispatch::TestProcess Document.create(:asset => fixture_file_upload("#{Rails.root}/path/to/image.png", "image/png")) 

或与工厂女孩

 include ActionDispatch::TestProcess FactoryGirl.define do factory :asset do asset { fixture_file_upload("#{Rails.root}/path/to/image.png", "image/png") } end end 

另一种方法是将属性值定义为yml并准备静​​态文件,以便我们可以在测试期间无需通过fixture_file_upload方法上传文件(=节省CPU资源)。

1)假设音乐模型具有如下音频回形针:

 class Music < ActiveRecord::Base has_attached_file :audio ... end 

2)定义音频存储目录,仅在config / environments / test.rb上进行测试:

 MyApp::Application.configure do Paperclip::Attachment.default_options[:path] = ':rails_root/test/data/paperclip/:class/:attachment/:id_partition/:filename' ... end 

(例如,音频文件“sound_of_music.mp3”将存储在test / data / paperclip / musics / audios / 111/222/333 / sound_of_music.mp3下,其中111222333是音乐记录ID,111/222/333是id_partiion部分定义于上述2)。)

(注意:上面的测试定义会影响开发/生产存储路径(我不知道为什么?)所以我需要在config / initializers / paperclip.rb中重新定义dev&prod的另一条路径,如下所示:)

 if Rails.env != 'test' Paperclip::Attachment.default_options[:path] = 'mount_prefix_for_your_app/:rails_env/:class/:attachment/:id_partition/:filename' end 

3)将test / fixtures / musics.yml写​​成:

 music01: title: 'sound of music' audio_file_name: sound_of_music.mp3 ... 

4)存储实际的mp3。 我们假设通过rails-console从/tmp/sound_of_music.mp3上传到上面2)中定义的回形针存储:

 $ RAILS_ENV=test bundle exec rails console > include ActionDispatch::TestProcess > m = Music.find_by_title('sound of music') > m.audio = fixture_file_upload("/tmp/sound_of_music.mp3", "audio/x-mpeg") > m.save! 

以上步骤1).. 4)是运行测试前的准备任务。

5)现在,我们可以在unit testing(或rails-4的模型测试)中使用它:

 class MusicTest < ActiveSupport::TestCase ... m = musics(:music01) assert File.exist?(m.audio.path) ...