Rails 在 rspec 测试中提供 ActiveStorage 图像

xxj*_*jnn 5 rspec rails-activestorage

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

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

http://localhost:3000/images/ABC # for development. Port for tests is 3030
Run Code Online (Sandbox Code Playgroud)

: 并重定向到 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
Run Code Online (Sandbox Code Playgroud)

在测试运行时使用byebugbinding.pry 之类的东西),我们可以确定事情是否正确设置(或者它们是否正确?):

(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
Run Code Online (Sandbox Code Playgroud)

:它确实返回了一个 ~3.5MiB 的图像。但是,当将页面保存为 HTML(该序列中的“blah.html”)时,在 byebug 运行时打开该 HTML 时,图像不会加载 - 调用...images/ABC被拒绝。

这是一个问题,因为我们使用 wicked_pdf 生成 PDF,并且在生成 PDF 的测试环境中,它无法访问这些图像以放入 PDF。

也许可以使测试服务器为 rspec 之外的响应提供服务?否则,PDF 中将没有图像。


附加说明 - 环境配置

在测试中我们添加了:

before do
  host! 'localhost:3030'
end
Run Code Online (Sandbox Code Playgroud)

: 虽然显然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
Run Code Online (Sandbox Code Playgroud)

活动存储在/config/storage.yml以下位置正确配置:

test:
  service: Disk
  root: <%= Rails.root.join("tmp/test_storage") %>
Run Code Online (Sandbox Code Playgroud)