Модульное тестирование загрузки скрепок с помощью Rspec (Rails) - PullRequest
22 голосов
/ 13 февраля 2010

Всего Rspec нуб здесь. Пишу мои первые тесты сегодня вечером.

У меня есть модель под названием Image. С помощью скрепки я прикрепляю файл с именем photo. Стандартные вещи. Я запустил генератор скрепок, и все отлично работает в производственных и тестовых режимах.

Теперь у меня есть файл спецификаций с именем image.rb, и он выглядит так (он был создан генератором nifty_scaffold Райана):

require File.dirname(__FILE__) + '/../spec_helper'

describe Image do

  it "should be valid" do
    Image.new.should be_valid
  end
end

Этот тест не пройден, и я понимаю, что это из-за проверок моей модели (то есть validates_attachment_presence)

Я получаю ошибку:

Errors: Photo file name must be set., Photo file size file size must be between 0 and 1048576 bytes., Photo content type is not included in the list

Так как мне сказать rspec загрузить фотографию, когда она запускает мой тест?

Я предполагаю, что это имеет какое-то отношение к светильникам ... может быть, и нет. Я пытался поиграть с ними, но безуспешно. Для записи, я создал папку с именем images в папке своих приборов и два файла, которые я хочу использовать в своих тестах, называются rails.png и grid.png)

Я пытался сделать следующее:

it "should be valid" do
  image = Image.new :photo => fixture_file_upload('images/rails.png', 'image/png').should be_valid 

  # I've also tried adding stuff like this
  #image.stub!(:has_attached_file).with(:photo).and_return( true )
  #image.stub!(:save_attached_files).and_return true
  #image.save.should be_true  
end

Но rspec жалуется на то, что «fixture_file_upload» не распознается ... Я планирую получить эту книгу Rspec. И я бродил по сети для ответа, но, похоже, ничего не могу найти. Моя тестовая база данных заполняется некоторыми данными, когда я удаляю проверки из моей модели, поэтому я знаю, что некоторые из них работают нормально.

Заранее спасибо,

EDIT:

images.yml выглядит так:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString

Ответы [ 4 ]

39 голосов
/ 13 февраля 2010

Это должно работать с Rails 2.X:

Image.new :photo => File.new(RAILS_ROOT + '/spec/fixtures/images/rails.png')

Начиная с Rails 3, RAILS_ROOT больше не используется, вместо этого вы должны использовать Rails.root.

Это должно работать с Rails 3:

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')

Определенно получите книгу RSpec, это фантастика.

19 голосов
/ 08 июня 2010

Rails.root является объектом pathname, поэтому вы можете использовать его следующим образом:

Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open

Edit - возможно, не работает в Rails 3 ...

  • см. Ответ @Paul Rosania
5 голосов
/ 04 июня 2010

В случае, если кто-то еще обнаружит это через Google, RAILS_ROOT больше не действует в Rails 3.0. Эта строка должна гласить:

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')

(Обратите внимание на отсутствие косой черты!)

1 голос
/ 12 января 2011

Я использую гем multipart_body в своих интеграционных тестах. Для BDD это немного честнее, чем тестирование.

http://steve.dynedge.co.uk/2010/09/19/multipart-body-a-gem-for-working-with-multipart-data/

Что касается rspec и paperclip, директива has_attached_file: photo создает своего рода виртуальный атрибут, например: photo ... при назначении файла или пути к фотографии, paperclip вступает во владение, сохраняет файл, при необходимости выполняет обработку в это например автоматически создавать миниатюры, импортировать электронную таблицу и т. д. Вы не говорите rspec проверить скрепку. Вы вызываете код и сообщаете rspec, какими должны быть результаты этого кода.

В $ GEM_HOME / gems / paperclip-2.3.8 / README.rdoc примерно 76% пути к файлу в разделе == Постобработка (в частности, строки 147 и 148):

--- [НАЧАЛО ЦИТАТЫ] --- ПРИМЕЧАНИЕ. Поскольку процессоры работают, превращая исходное вложение в стили, процессоры не запускаются, если не определены стили. --- [КОНЕЦ ЦИТАТЫ] ---

Читая код, вы увидите поддержку: оригинал ... ваш has_attached_file определяет стиль?

Я использую универсальный ": styles => {: original => {: this_key_and =>: this_value_do_not_do_anything_unless_a_ lib _paperclip_processors__foo_dot_rb__does_something_with_them}}" ... просто чтобы получить файл из файла в мой файл has_attached_file: путь

Можно подумать, что это будет по умолчанию или более очевидно в документах.

...