Длина загружаемого файла в Ruby on Rails уменьшается после UploadedFile.read - PullRequest
0 голосов
/ 25 февраля 2011

В приложении RoR, которое я унаследовал, тест не пройден, который включает загрузку файла.Неудачное утверждение выглядит так:

assert_equal File.size("#{RAILS_ROOT}/test/fixtures/#{filename}"), @candidate.picture.length

Не удается с (тестовый файл 69 байтов):

<69> expected but was <5>.

Это после сообщения, использующего:

fixture_file_upload(filename, content_type, :binary)

В модели-кандидате загруженный файл присваивается свойству, которое затем сохраняется в mediumblob в MySQL.Мне кажется, что загруженный файл имеет размер 69 байт, но после того, как он назначен свойству модели (с помощью UploadedFile.read), длина отображается как всего 5 байт.

Итак, этот код:

puts "file.length=" + file.length.to_s
self.picture = file.read
puts "self.picture.length=" + self.picture.length.to_s

приводит к такому выводу:

file.length=69
self.picture.length=5

Я немного растерялся, почему это так, любые идеи

1 Ответ

0 голосов
/ 28 февраля 2011

Это связано с особенностью Windows / Ruby, когда чтение файла происходило в текстовом режиме.В этом приложении есть расширение в test_helper, что-то вроде:

class ActionController::TestUploadedFile
  # Akward but neccessary for testing since an ActionController::UploadedFile subtype is expected
  include ActionController::UploadedFile

  def read
    tempfile = File.new(self.path)
    tempfile.read
  end
end

И, очевидно, в Windows существует специальный метод ввода-вывода, который можно вызвать, чтобы принудительно перевести файл в двоичный режим.Вызов этого метода для временного файла, например, так:

tempfile.binmode

заставил все работать должным образом, при этом чтение из файла UploadedFile соответствовало размеру файла Fixture на диске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...