2013-11-15 4 views
4

Я хочу протестировать модель с базовой загрузкой файла, которая не использует плагин (я думаю, что в то время это была плохая идея, но знаю, что мне приходится иметь дело с тоннами существующих документов).Как проверить загрузку файла с помощью 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-х решений.

ответ

12

Я вижу один выпуск. UpLoadedFile (:tempfile) ожидает, что файл не является строкой. Для вас это никогда не превращалось в String, которую вы определяли как String. Вам необходимо окружить его File.new(), как показано ниже. Перед тем, как попытаться запустить тест, вам нужно поставить файл. Надеюсь это поможет!

FactoryGirl.define do 
    factory :attachment do 
    file ActionDispatch::Http::UploadedFile.new(:tempfile => File.new("#{Rails.root}/spec/fixtures/anyfile.txt"), :filename => "anyfile.txt") 
    end 
end 
+0

Вы только что сделали свой день! Thks! –

Смежные вопросы