Загрузка модулей с помощью Rspec (Rails)
Всего здесь Rspec noob. Написал мои первые тесты сегодня вечером.
У меня есть модель под названием Image. С помощью paperclip я прикрепляю файл с именем photo. Стандартный материал. Я запустил генератор скрепки, и все работает отлично в производственных и тестовых режимах.
Теперь у меня есть spec файл с именем image.rb, и он выглядит так (он был создан генератором ryanb 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 внутри моей папки fxtures, и два файла, которые я хочу использовать в своих тестах, называются 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
Ответы
Ответ 1
Это должно работать с 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, это фантастика.
Ответ 2
Rails.root - это объект пути, поэтому вы можете использовать его следующим образом:
Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open
Изменить - возможно, не работает в Rails 3...
- см. ответ by @Paul Rosania
Ответ 3
Если кто-либо еще обнаружит это через Google, RAILS_ROOT больше не действует в Rails 3.0. Эта строка должна читать:
Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')
(Обратите внимание на отсутствие ведущей косой черты!)
Ответ 4
Я использую драгоценный камень 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 создает виртуальный атрибут sort, то есть: photo... когда вы назначаете файл или путь к фотографии, paperclip берет на себя, сохраняет файл, при необходимости обрабатывает это, например, автоматически создавать миниатюры, импортировать электронную таблицу и т.д. Вы не говорите rspec для проверки скрепки. Вы вызываете код и указываете rspec, какие результаты этого кода должны быть.
В $GEM_HOME/gems/paperclip-2.3.8/README.rdoc, около 76% пути к файлу в разделе "Обработка почты" (в частности, строки 147 и 148):
--- [BEGIN QUOTE] --- ПРИМЕЧАНИЕ. Поскольку процессоры работают, поворачивая исходное вложение в стили, никакие процессоры не будут запущены, если не определены стили.
--- [КОНЕЦ ЦИТАТЫ] ---
Считывая код, вы увидите поддержку: original... ваш 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}} "... просто для того, чтобы заставить paperclip переместить файл из некоторого каталога temp в мой has_attached_file: путь
Можно подумать, что это было бы дефолтом или более очевидным в документах.