在我继承的RoR应用上,测试失败涉及文件上传。失败的断言看起来像是这样:
assert_equal File.size("#{RAILS_ROOT}/test/fixtures/#{filename}"), @candidate.picture.length
失败(测试文件为69字节):
<69> expected but was <5>.
这是在发布帖子后使用:
fixture_file_upload(filename, content_type, :binary)
在候选模型中,上传的文件被分配给一个属性,然后将其保存到MySQL中的mediumblob中。在我看来,上传的文件是69个字节,但在将其分配给model属性(使用UploadedFile.read)之后,长度仅显示为5个字节。
所以这段代码:
puts "file.length=" + file.length.to_s
self.picture = file.read
puts "self.picture.length=" + self.picture.length.to_s
导致此输出:
file.length=69
self.picture.length=5
我有点不知道为什么会这样,有什么想法吗?
答案 0 :(得分:0)
这归结为Windows / Ruby特性,其中读取文件似乎是在文本模式下发生的。 test_helper中有一个扩展程序,如:
class ActionController::TestUploadedFile
# Akward but neccessary for testing since an ActionController::UploadedFile subtype is expected
include ActionController::UploadedFile
def read
tempfile = File.new(self.path)
tempfile.read
end
end
显然,在Windows上,可以调用特定的IO方法来强制文件进入二进制模式。在tempfile上调用此方法,如下所示:
tempfile.binmode
导致一切按预期工作,UploadedFile的读取与磁盘上fixture文件的大小相匹配。