Rails 3 испытательных светильника с несущей волной? - PullRequest
18 голосов
/ 24 сентября 2011

Я работаю над обновлением attachment_fu до carrierwave, так как attachment_fu не работает в rails 3.

Ни один из тестов не может быть запущен, потому что у нас есть недопустимые приборы, которые использовали синтаксис для attachment_fu дляфайлы вложений.

Например, у нас есть модель Post с одним PostAttachment.Вот как выглядят данные в приборе PostAttachment:

a_image:
  post_id: 1
  attachment_file: <%= Rails.root>/test/files/test.png

И вот эта ошибка, которую я получаю:

ActiveRecord::StatementInvalid: PGError: ERROR:  column "attachment_file" of relation "post_attachments" does not exist
LINE 1: INSERT INTO "post_attachments" ("post_id", "attachment_file"...

attachment_file была бы подобрана attachment_fu,и он позаботился бы обо всей обработке, чтобы создать вложение attachment_fu для модели.

Есть ли способ иметь вложения изображений в приборах, но с использованием вместо этого CarrierWave?

Ответы [ 5 ]

19 голосов
/ 14 августа 2014

Единственный способ, которым мне удалось заставить это работать, - использовать провайдера хранилища специально для тестирования, которое фактически не сохраняет / читает файлы.

В вашем config/initializers/carrier_wave.rb Добавьте класс NullStorage, который реализует минимальный интерфейс для провайдера хранения.

# NullStorage provider for CarrierWave for use in tests.  Doesn't actually
# upload or store files but allows test to pass as if files were stored and
# the use of fixtures.
class NullStorage
  attr_reader :uploader

  def initialize(uploader)
    @uploader = uploader
  end

  def identifier
    uploader.filename
  end

  def store!(_file)
    true
  end

  def retrieve!(_identifier)
    true
  end
end

Затем при инициализации CarrierWave добавьте предложение для тестовой среды, например,

if Rails.env.test?
    config.storage NullStorage
end

Вот справочник моего полного файла carrier_wave.rb . В нем также описано, как настроить S3 для загрузки в промежуточное / производственное и локальное хранилище для разработки, чтобы вы могли увидеть, как настроить CarrierWave в контексте.

После настройки CarrierWave вы можете просто вставить любую строку в столбец фикстур, чтобы имитировать загруженный файл.

9 голосов
/ 24 сентября 2011

Попробуйте передать файл вместо строки.

a_image:
    post_id: 1
    attachment_file: File.open(Rails.root.join("test/files/test.png"))

Это работает для меня, используя FactoryGirl

Примечание: Редактируйте благодаря @ dkobozev

2 голосов
/ 29 августа 2016

конфиг / Инициализаторы / carrier_wave.rb

In Rails 4

# class NullStorage is defined here before the following block

if Rails.env.test?
  CarrierWave.configure do |config|
    config.storage NullStorage
  end
end

и в светильниках:

a_image:
  post_id: 1
  attachment_file: <%= File.open(Rails.root.join("test/files/test.png")) %>
1 голос
/ 09 сентября 2014

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

0 голосов
/ 07 июля 2015

Мы только что удалили все приборы, система отправляет эти файлы для каждого тестаСпросите себя ... Вам нужны все эти приборы здесь для этого теста?Нет, вероятно, нет.И светильники не взрыва!поэтому мы просто используем Model.create!( ... ) с конкретными данными для теста

...