gpt4 book ai didi

ruby-on-rails - 如何在测试环境中通过 URL 访问 ActiveStorage 对象?

转载 作者:行者123 更新时间:2023-12-04 01:52:53 25 4
gpt4 key购买 nike

给定具有 ActiveStorage 附件的模型

class MyObject
has_one_attached :avatar
end

在开发环境中,我能够将头像检索为 StringIO 对象。
obj = MyObject.new( { valid params } )
file = File.open( Rails.root.join( "spec/support/images/test_image.jpg" ))
obj.avatar.attach( io: file, filename: "test_image.jpg" )
obj.save

version = obj.avatar.variant( resize: '200x200>').processed
version_url = Rails.application.routes.url_helpers.url_for( version )
download = open(version_url)
download.class
=> StringIO

当我尝试在测试环境中做同样的事情时, open(version_url)返回
Errno::ECONNREFUSED Exception: Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000)

有没有人在测试中成功下载过 activestorage 附件?我应该如何配置测试环境来实现这一点?

我的测试环境已经有了
config.active_storage.service = :test
Rails.application.routes.default_url_options = {host: "localhost:3000"}

我忽略了什么?

编辑
#storage.yml
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>

最佳答案

通过 Rails 应用服务器访问存储的文件

Active Storage 附件生成指向应用程序的 URL。应用程序 URL 端点然后重定向到真实文件。这将文件的物理位置与 URL 分离,并提供对镜像等功能有用的间接性。

这也意味着为了使用生成的 URL 访问文件,Rails 应用程序服务器必须正在运行......

服务器不在测试环境中运行

Rails 测试套件在运行测试时不会启动服务器。测试通常不需要一个就可以运行。

Errno::ECONNREFUSED Exception: Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000)

发生此错误的原因是 open调用尝试在服务器位置请求文件 localhost:3000 .因为没有服务器在运行,所以它失败了。

即使你启动了一个开发服务器,它仍然会失败,因为 Active Storage AttachmentBlob记录存储在测试数据库中,而不是开发数据库中。

绕过应用服务器并直接获取文件的路径

为了访问测试套件中的文件或变体,您需要绕过应用程序服务器并获得磁盘上文件的直接路径。

Active Storage 测试套件源代码向我们展示了如何执行此操作:
blob_or_variant.service.send(:path_for, blob_or_variant.key)

View Source

这将返回一个文件路径(在磁盘上),然后您可以使用 File.open 打开该路径。 .

修复上面的例子

在上面的例子中,改变
download = open(version_url) # BAD: tries to access using HTTP


download = File.open( version.service.send(:path_for, version.key) )

使用 stub 来避免测试套件中的网络请求

如果您正在测试使用 HTTP 访问文件的代码,最好的做法是 stub 网络调用以完全避免它。

这里有一些很好的例子来说明如何在 RSpec 中做到这一点:
RSpec how to stub open?

关于ruby-on-rails - 如何在测试环境中通过 URL 访问 ActiveStorage 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52071890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com