带回形针的夹具

Dor*_*ian 7 testing storage ruby-on-rails fixtures paperclip

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

<% doc = Document.create(:asset => File.open(Rails.root.join('spec', 'assets', 'image.png'))) %>
<%= part_event_image %>:
  asset_file_name: <%= doc.asset_file_name %>
  asset_content_type: <%= doc.asset_content_type %>
  asset_file_size: <%= doc.asset_file_size %>
  asset_updated_at: <%= doc.asset_updated_at %>
  documentable: party (Event) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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

m4t*_*m4t 6

你可以做 fixture_file_upload

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

或与工厂女孩

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :asset do
    asset { fixture_file_upload("#{Rails.root}/path/to/image.png", "image/png") }
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

class Music < ActiveRecord::Base
  has_attached_file :audio
  ...
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

(例如,音频文件"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
Run Code Online (Sandbox Code Playgroud)

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

music01:
  title: 'sound of music'
  audio_file_name: sound_of_music.mp3
  ...
Run Code Online (Sandbox Code Playgroud)

4)存储实际的mp3.我们假设从/tmp/sound_of_music.mp3通过rails-console上传到上面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!
Run Code Online (Sandbox Code Playgroud)

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

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

class MusicTest < ActiveSupport::TestCase
  ...
  m = musics(:music01)
  assert File.exist?(m.audio.path)
  ...
Run Code Online (Sandbox Code Playgroud)