首页 > 解决方案 > Rails 在 rspec 测试中提供 ActiveStorage 图像

问题描述

在开发和生产中,我们可以在浏览器中访问图片。这在测试运行时不适用于测试环境。

我们用于图像的 URL 格式如下:

http://localhost:3000/images/ABC # for development. Port for tests is 3030

: 并且它重定向到一个 ActiveStorage 附件服务 URL - 它看起来像这样:

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 (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.5MiB 的图像。但是,当将页面保存为 HTML 时(在该序列中为“blah.html”),在运行 byebug 时打开该 HTML 时,图像不会加载 - 调用...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") %>

标签: rspecrails-activestorage

解决方案


推荐阅读