gpt4 book ai didi

ruby-on-rails - 为什么 Ruby open-uri open 在我的单元测试中返回一个 StringIO,而在我的 Controller 中返回一个 FileIO?

转载 作者:数据小太阳 更新时间:2023-10-29 06:25:47 24 4
gpt4 key购买 nike

我继承了一个 Rails 2.2.2 应用程序,它在 Amazon S3 上存储用户上传的图像。基于 attachment_fu 的 Photo 模型提供了一个 rotate 方法,该方法使用 open-uri 从 S3 和 MiniMagick 中检索图像以执行旋转。

rotate 方法包含这一行来检索用于 MiniMagick 的图像:

temp_image = MiniMagick::Image.from_file(open(self.public_filename).path)

self.public_filename 返回类似

的内容
http://s3.amazonaws.com/bucketname/photos/98/photo.jpg

检索图像并旋转它在生产和开发中运行的应用程序中工作得很好。但是,单元测试失败了

TypeError: can't convert nil into String
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `initialize'
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `open'
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `from_file'

原因是在单元测试的上下文中调用模型方法时,open(self.public_filename) 返回一个包含图像的 StringIO 对象数据。此对象的 path 方法返回 nil 并且 MiniMagick::Image.from_file 爆炸了。

当从 PhotosController 调用这个完全相同的模型方法时,open(self.public_filename) 返回一个绑定(bind)到文件的 FileIO 实例命名,例如,/tmp/open-uri7378-0,文件包含图像数据。

考虑到原因一定是测试和开发之间的一些环境差异,我在开发环境下启动了控制台。但是就像在单元测试中一样,open('http://...') 返回了一个 StringIO不是 文件 IO

我已经通过 open-uri 和所有相关的特定于应用程序的代码追踪了我的方式,并没有找到差异的原因。

最佳答案

open-uri 库使用常量来设置 StringIO 对象的 10KB 大小限制。

> OpenURI::Buffer::StringMax
=> 10240

您可以将此设置更改为 0 以防止 open-uri 创建 StringIO 对象。相反,这将强制它始终生成一个临时文件。

只需将其放入初始化程序中即可:

# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
require 'open-uri'
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0

你不能直接设置常量。你需要实际删除常量然后重新设置它(如上所述),否则你会收到警告:

warning: already initialized constant StringMax

12/18/2012 更新:默认情况下,Rails 3 不需要 OpenURI,因此您需要在顶部添加 require 'open-uri'初始值设定项。我更新了上面的代码以反射(reflect)该更改。

关于ruby-on-rails - 为什么 Ruby open-uri open 在我的单元测试中返回一个 StringIO,而在我的 Controller 中返回一个 FileIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694115/

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