Rspec манипулирует валидатором размера загрузки в тесте - PullRequest
0 голосов
/ 12 июня 2019

На моей attachment модели у меня есть эта проверка:

validates_attachment_size :data, less_than: 8.megabyte, message: :data_file_size_error

Он делает все, что мне нужно, но для того, чтобы проверить это, сейчас мне действительно нужно сохранить файл 9 МБ на моем диске. Поскольку мое приложение довольно большое, я бы хотел этого не делать.

Итак, мои мысли были - могу ли я манипулировать самим методом валидации, но только для теста. Скажем, установить проверку внутри блока context размером 5 КБ, попробовать загрузить файл 6 КБ, а затем вернуть его в нормальное состояние?

(Для справки: процесс довольно громоздкий - я создаю исходящее электронное письмо, затем добавляю в него файл, затем пытаюсь импортировать этот файл. Вот почему я хотел бы сохранить файл довольно маленьким. я попытался выбрать stub размер файла, но в интеграционном тесте Rspec по-прежнему получал бы доступ к реальному размеру, что приводило к неудачным тестам)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Я думаю, что вы не можете легко заглушить размер файла, потому что он проверяется только один раз, во время загрузки класса. Есть несколько способов решить эту проблему:

  1. Вы можете хранить файл размером 9 МБ в некотором каталоге, который добавлен в .gitignore, например, tmp/testfiles и при запуске spec вы можете создать этот файл, если его нет. Таким образом, вы сгенерируете его только один раз, поэтому будущие тесты будут выполняться быстрее (нет необходимости каждый раз генерировать его), и вы не будете хранить его в своем хранилище

  2. Вы можете сделать опцию less_than динамической, то есть сделать что-то вроде less_than: -> { maximum_file_size }, а затем определить метод def self.maximum_file_size; 8.megabyte; end. Тогда вы сможете легко заглушить это, потому что максимальный размер определяется при каждой загрузке. Недостатком является то, что вы добавляете динамический параметр только для целей тестирования, но он влияет на ваш производственный код.

  3. Вы можете просто написать модульный тест, который проверит, что вызывается правильный размер. it { should validate_attachment_size(:image).less_than(5.megabytes) }. Тогда вы не выполняете фактическую загрузку файла, но пока вы доверяете своей библиотеке, этого теста должно быть достаточно. (код предполагает, что вы используете Paperclip, для других библиотек он может выглядеть иначе).

0 голосов
/ 13 июня 2019

На самом деле я думаю, что это решение довольно элегантно, и это то, что я в конечном итоге использовал:

validator = Profile::Attachment._validators[:data].find{|validator| validator.options[:less_than]}
validator.stubs(:options).returns({less_than: 2500, message: :data_file_size_error}) # 2500 Bytes are ~ 2,44 KB

с этим кодом я могу загрузить файл размером 3 КБ, и это приведет к сбою проверки.

...