Rails команда 'post' в контроллерах rspec: файлы не проходят. (Есть ли многокомпонентная настройка?) - PullRequest
6 голосов
/ 02 сентября 2011

Я пытаюсь запустить следующую спецификацию

describe "POST create" do
  describe "with valid params" do
    it "redirects to the created banner" do
      post :create, :banner => valid_attributes
      response.should redirect_to(admin_banner_url(Banner.last))
    end
  end
end


def valid_attributes
  demo_image = File.open(File.join(Rails.root, "spec", "samples", "laptop1.jpg"))
  {
    :name => 'Test Spec Banner',
    :bannerimage => demo_image
  }
end

Создание не проходит проверку для validates_presence_of: bannerimage - я сузил его следующим образом:

  • ЕслиЯ убираю валидацию validates_presence_of из bannerimage, она работает, но баннер сообщается как «missing.png»
  • Banner.create! (Valid_attributes) works
  • Я показал только одну спецификациювыше, но проблема возникает в любой спецификации, которая включает этот пост: create,: banner => valid_attributes line
  • Я удалил все ссылки на attr_accessible ... без разницы
  • I 'Вы пытались переключить validate_attributes в Factory.attributes_for (: banner), с той же информацией о файле в: bannerimage
  • Форма отлично работает через браузер, включая загрузку / обработку изображений
  • File.exists?подтверждает, что указанный файл действительно существует.

Если у кого-нибудь есть идеи о том, почему сообщение не работает, я был бы очень признателен.Я предполагаю (и простите - я не изучал внутреннюю работу команды 'post' и, возможно, здесь отключен), что в этом вызове отсутствует какой-то параметр 'multipart' для вызова файлов (?) ...не могу найти что-нибудь через google.

Любые идеи приветствуются - я в полном замешательстве.

Контроллер является полностью неизмененным ресурсом скаффолдов Rails 3.1.Модель ниже.

class Banner < ActiveRecord::Base
  # attr_accessible :name, :url, :bannerimage

  has_attached_file :bannerimage, :styles => { :full => "960x", :thumb => "100x" }

  validates_attachment_content_type :bannerimage, :content_type => [ 'image/jpg', 'image/jpeg', 'image/gif', 'image/png'], :message => 'file must be a gif, jpeg or png image'

  validates_attachment_size :bannerimage, :less_than => 3.megabytes

  validates_presence_of :name
  validates_attachment_presence :bannerimage
  validates_uniqueness_of :name

  has_many :pages, :dependent => :nullify

  def to_s
    name
  end
end

1 Ответ

18 голосов
/ 02 сентября 2011

В зависимости от вашей конкретной настройки теста, вместо отправки File.open может работать некоторая комбинация следующего:

fixture_file_upload('spec/samples/laptop1.jpg', 'image/jpg')

Эта функция определяется rails, и я полагаю, что она доступна даже с rspec-railsхотя rails ожидает, что вы будете использовать TestUnit

Я использовал это в определениях шагов Cucumber, это может работать в примерах rspec.

Rack::Test::UploadedFile.new('spec/samples/laptop1.jpg', 'image/jpg')
...