При разработке и производстве мы можем получить доступ к изображениям в браузере.Это не работает в тестовой среде во время выполнения тестов.
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
Использование byebug (подобная привязке. вещь) во время выполнения теста мы можем убедиться, что все настроено правильно (или они?):
(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") %>