В процессе разработки и производства мы можем получать доступ к изображениям в браузере. Это не работает для тестовой среды во время выполнения тестов.
URL-адрес, который мы используем для изображений, имеет следующий формат:
http://localhost:3000/images/ABC# for development. Port for tests is 3030
: и перенаправляет на URL-адрес службы вложений ActiveStorage, который выглядит следующим образом:
http://localhost:3000/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDFTVEd0WlpUbHFlVGh0YW1od1JucEdkMUJuYWxaelNuSUdPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDYtMDhUMDc6MDM6MDUuNDI2WiIsInB1ciI6ImJsb2Jfa2V5In19--abef581f4df7a19ae1a35a2be03edd028659441f/454.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22454.jpg%22%3B+filename%2A%3DUTF-8%27%27454.jpg
Используя прощай (binding.pry like thing) во время выполнения теста, мы можем убедиться, что все настроено правильно (или это так?):
(byebug) @request.host
"localhost"
(byebug) @request.port
3030
(byebug) File.open("blah.html", 'w'){|file| file.write(response.body)}
1854
(byebug) get(image_source_path(id: 'ABC'))
302
(byebug) response.redirect_url
"http://localhost:3030/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaEpJaDEwUWpkVmRFeHJUalV5YUdsYU5XOUdPR0Y2UVZCVFpsb0dPZ1pGVkE9PSIsImV4cCI6IjIwMTgtMDYtMDhUMDc6MjU6NDEuNzkzWiIsInB1ciI6ImJsb2Jfa2V5In19--42f8cd5ca06b07704a6550a19aaa143a6eeb0c6e/pig_admirer.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22pig_admirer.jpg%22%3B+filename%2A%3DUTF-8%27%27pig_admirer.jpg"
(byebug) get(response.redirect_url)
200
(byebug) response.content_length
3618075
: он действительно возвращает изображение размером ~ 3,5 МБ. Однако при сохранении страницы в формате HTML («blah.html» в этой последовательности) при открытии этого HTML-кода во время работы byebug изображения не загружаются - вызовы ...images/ABC отклоняются.
Это проблема, потому что мы используем wicked_pdf для создания PDF-файла, а в тестовой среде, когда создается PDF-файл, он не может получить доступ к этим изображениям для помещения в PDF-файл.
Может быть, тестовый сервер может обслуживать ответы вне rspec? В противном случае в PDF не будет изображений.
В тест мы добавили:
before do
host! 'localhost:3030'
end
: хотя очевидно, что host! устарел. И когда мы попытались перенести его на /rails_helper.rb, он сломал целый ряд других тестов.
В /config/environments/test.rb, среди прочего, есть:
Rails.application.configure do
config.active_storage.service = :test
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.host = 'localhost:3030'
config.action_controller.default_url_options = { host: 'localhost:3030' }
config.assets.compile = true
config.allow_concurrency = true
end
В /config/storage.yml правильно настроено активное хранилище:
test:
service: Disk
root: <%= Rails.root.join("tmp/test_storage") %>
Ага! Да, извините, коллега сказал, что тесты однопоточные, поэтому решения нет. Мы использовали заглушку. Хотя это не совсем решение ... твоя проблема с креветками вне тестов? В таком случае задайте отдельный вопрос и дайте ссылку на него в комментарии.
Спасибо @xxjjnn, хотя я столкнулся с этим в Prawn, похоже, это более общая проблема, связанная с доступом к файлу в тестовой среде. Подробнее здесь: stackoverflow.com/questions/52071890/…





вы когда-нибудь решали эту проблему? У меня аналогичная проблема с вложениями ActiveStorage в генераторе PDF с креветками.