Светильники со скрепкой - PullRequest
7 голосов
/ 16 марта 2012

Я использую 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 %>

Но я его запустил, документ существует в базе данных, но он не сохраняется.

Должен ли я хранить документ самостоятельно (записать файл)? Или есть другой способ?

Ответы [ 2 ]

6 голосов
/ 05 июня 2012

Вы можете сделать с 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
5 голосов
/ 31 декабря 2013

Другой подход состоит в том, чтобы определить значение атрибута для yml и подготовить статический файл, чтобы мы могли использовать его, не загружая файлы на лету во время теста, используя метод fixture_file_upload (= сохраняет ресурс ЦП).

1) Предположим, что музыкальная модель имеет аудио скрепку следующим образом:

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

2) определить каталог аудио хранилища для тестирования только в config / environment / 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 - это идентификатор музыкальной записи, а 111/222/333 является частью id_partiion, определенной в 2) выше.)

(ПРИМЕЧАНИЕ: приведенное выше определение для теста влияет на путь разработки / хранения (не знаю почему?), Поэтому мне нужно было переопределить другие пути для dev & prod следующим образом в config / initializer / paperclip.rb:)

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. Предположим, что вы загрузили из /tmp/sound_of_music.mp3 в хранилище скрепки, определенное в пункте 2 выше, через rails-console:

$ 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) Теперь мы можем использовать его при юнит-тесте (или при тестировании модели на рельсах-4) как:

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