我想使用不使用插件的基本文件上传来测试模型(我当时认为这是个坏主意,但知道我必须处理大量现有文件)。
问题是我想测试上传文件的大小,所以我需要访问temfile的file属性,它是一个ActionDispatch::Http::UploadedFile
它在我的 Controller 中效果很好,但是我找不到如何使我的工厂通过的方法。
附件型号:
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上出现错误:它已更改为String。
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,但我无法使其正常工作,因为这两个解决方案中的任何一个都不存在tempfile。
请您参考如下方法:
我看到一个问题。 UpLoadedFile(:tempfile)期望文件不是字符串。观察一下,它从未更改为将String定义为String的字符串。您需要用File.new()包围它,如下所示。您需要先将文件放在此处,然后再尝试运行测试。希望这可以帮助!
FactoryGirl.define do
factory :attachment do
file ActionDispatch::Http::UploadedFile.new(:tempfile => File.new("#{Rails.root}/spec/fixtures/anyfile.txt"), :filename => "anyfile.txt")
end
end




