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

Контрольные приборы Rails 3 с несущей волной?

Я работаю над обновлением от attachment_fu до несущей, так как attachment_fu разбит на рельсы 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?

4b9b3361

Ответ 1

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

В вашем 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 вы можете просто поместить любую строку в столбец fixtures для имитации загруженного файла.

Ответ 2

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

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

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

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

Ответ 3

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

В 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")) %>

Ответ 4

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

Ответ 5

Я знаю, что он старый, но для некоторых, кто использует Rails 5 + RSpec + CarrierWave + Fixtures:

Изменить тестовые конфигурации:

# config/initializers/carrierwave.rb
if Rails.env.test?
  class NullStorage < CarrierWave::Storage::Abstract
    def store!(_file)
      _file
    end

    def retrieve!(identifier)
      file = Rails.root.join('spec', 'fixtures', 'files', identifier)
      tmp = Rails.root.join('tmp', 'blank_tmp.jpg')
      FileUtils.cp(file, tmp)
      CarrierWave::SanitizedFile.new(tmp)
    end
  end

  CarrierWave.configure do |config|
    config.storage = NullStorage
    config.enable_processing = false
  end
end

Создайте папку и файл, например spec/fixtures/files/some-user-photo.jpg

и создайте несколько приборов, например:

first_user:
  avatar: "some-user-photo.jpg"
  name: "First User Name"
  about: "First User About Long Text..."
  lat: 0.001
  lng: 0.001
  created_at: <%= Time.current - 3.days %>
  updated_at: <%= Time.current - 3.days %>

Этого достаточно, чтобы тест понял, что у этого пользователя есть avatar

Ответ 6

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