【发布时间】:2014-01-31 05:03:37
【问题描述】:
我想通过不使用插件的基本文件上传来测试一个模型(我认为当时这是一个坏主意,但我知道我必须处理大量现有文档)。
问题是我想测试上传文件的大小,所以我需要访问file的temfile属性,这是一个ActionDispatch::Http::UploadedFile
它在我的控制器中运行良好,但我找不到如何让我的工厂通过。
附件模型:
attr_accessor :file # file_field_tag name
attr_accessible :file, :filename # store the filename in the db
before_save :upload_file
def upload_file
if self.file && File.size(self.file.tempfile) < 10.megabytes
puts self.file.class.inspect # see below
File.open("#{Rails.root.to_s}/files/" + self.filename.to_s, 'wb') do |f|
f.write(self.file.read)
end
ensure_file_presence
end
end
FactoryGirl 附件:
FactoryGirl.define do
factory :attachment do
filename 'anyfile.txt'
file ActionDispatch::Http::UploadedFile.new(:tempfile => "#{Rails.root}/spec/fixtures/anyfile.txt", :filename => "anyfile.txt")
end
end
当我运行测试时,FactoryGirl.build :attachment 会成功,但create 会失败。
奇怪的观察:我在 File.open 之前显示了self.file 类,它被视为ActionDispatch::Http::UploadedFile,然后我在self.file.read 上出现错误:它已更改为字符串。
puts self.file.class.inspect
=> ActionDispatch::Http::UploadedFile
f.write(self.file.read) => NoMethodError: undefined method `read' for #<String:0x007ff50f70f6a0>
我已阅读其他建议我应该使用 Rack::Test::UploadedFile 或 fixture_file_upload 的帖子,但我无法使其工作,因为这两种解决方案都不存在临时文件。
【问题讨论】:
标签: file-upload ruby-on-rails-3.2 factory-bot