Контрольные приборы 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?
Ответы
Ответ 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!( ... )
с конкретными данными для теста