Я хочу протестировать модель с базовой загрузкой файла, которая не использует плагин (я думаю, что в то время это была плохая идея, но знаю, что мне приходится иметь дело с тоннами существующих документов).Как проверить загрузку файла с помощью factorygirl?
Дело в том, что я хочу, чтобы проверить размер загружаемого файла, так что мне нужно, чтобы получить доступ к атрибуту temfile
из file
который является ActionDispatch :: Http :: UploadedFile
Он работает очень хорошо в моем но я не могу найти, как сделать мой завод.
Приложение Модель:
attr_accessor :file # file_field_tag name
attr_accessible :file, :filename # store the filename in the db
before_save :upload_file
def upload_file
if self.file && File.size(self.file.tempfile) < 10.megabytes
puts self.file.class.inspect # see below
File.open("#{Rails.root.to_s}/files/" + self.filename.to_s, 'wb') do |f|
f.write(self.file.read)
end
ensure_file_presence
end
end
FactoryGirl Вложение:
FactoryGirl.define do
factory :attachment do
filename 'anyfile.txt'
file ActionDispatch::Http::UploadedFile.new(:tempfile => "#{Rails.root}/spec/fixtures/anyfile.txt", :filename => "anyfile.txt")
end
end
Когда я запускаю тесты, FactoryGirl.build :attachment
будет успешным, но с create
потерпит неудачу.
Странное наблюдение: я показал класс self.file
перед File.open, и это видно как ActionDispatch::Http::UploadedFile
, после чего у меня есть ошибка на self.file.read
: он изменился на строку.
puts self.file.class.inspect
=> ActionDispatch::Http::UploadedFile
f.write(self.file.read) => NoMethodError: undefined method `read' for #<String:0x007ff50f70f6a0>
Я прочитал другие должности, предполагающие следует использовать Rack::Test::UploadedFile
или fixture_file_upload
, но я не могу заставить его работать, как временный файл не существует какой-либо из этих 2-х решений.
Вы только что сделали свой день! Thks! –