У меня есть модель Person, у которой много изображений, где у изображений есть поле вложения скрепки, называемое данными, сокращенная версия отображается ниже:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Лицо должно иметь как минимум одно изображение, прикрепленное к нему.
При использовании 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, я также пробовал код, закомментированный выше, был также опробован) В большинстве случаев, когда я запускаю функции огурца, я получаю сообщение об ошибке, подобное следующему:
Нет такого файла или каталога - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
Иногда тесты проходят успешно.
Может ли кто-нибудь сказать мне, в чем проблема, или как они используют FactoryGirl и Paperclip вместе, чтобы достичь чего-то вроде того, чего я пытаюсь достичь?
Я использую Rails 3.
Ответы:
Вы можете использовать fixture_file_upload
include ActionDispatch::TestProcess
в вашем помощнике по тестированию вот пример фабрики:В приведенном выше примере
spec/photos/test.png
перед запуском тестов он должен существовать в корневом каталоге вашего приложения.Обратите внимание,
FactoryBot
это новое имя дляFactoryGirl
.источник
{ }
, обязательны. Без него он ломаетсяinclude ActionDispatch::TestProcess
должно быть вставлено в самом начале файла фабрики, вне вFactoryGirl.define do...end
блоке.Новый синтаксис FG и не требует включения
или, еще лучше,
источник
Десмонд Боу из Pivotal Labs предлагает избегать fixture_file_upload из-за проблем с утечкой памяти. Вместо этого вы должны установить поля скрепки прямо на вашем заводе:
источник
content_type
. Для этого вам понадобится действующий файловый объект.Я использовал код, приведенный ниже:
Рельсы 2
http://gist.github.com/162881
Рельсы 3
https://gist.github.com/313121
источник
источник
Попробуйте использовать ActionController :: TestUploadedFile. Вы можете просто установить для свойства file экземпляр TestUploadedFile, а об остальном позаботится скрепка. Например
источник
Приведенные выше ответы в некоторых случаях могут помочь, и один действительно помог в одной из моих ситуаций, но при использовании Carrierwave предыдущее решение из этого вопроса на этот раз не сработало.
ПЕРВЫЙ ПОДХОД:
Для меня добавление
after :create
решенной проблемы для меня вот так:Установка встроенного видеофайла, например
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
не сработала, и он сообщал об ошибках.ВТОРОЙ ПОДХОД:
Определите такую фабрику (измените
personal_file
имя вашего вложения):И добавьте эти строки в
config/environemnts/test.rb
:источник
Что именно вы тестируете? Скрепка успешно прикрепит файл? Это действительно похоже на тест, который должна обрабатывать скрепка, а не ваше приложение.
Ты пробовала
Мы используем Machinist вместо factory_girl и просто использовали такие вещи, как
Хотя, когда мы это делаем, мы не особо много тестируем, обычно мы просто хотим иметь действующий
Image
объект.источник