Подтвердить что ты не робот

Загрузка модулей с помощью 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
4b9b3361

Ответ 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: путь

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