我想测试一个没有使用插件的基本文件上传的模型(我认为当时这是一个坏主意,但我知道我必须处理大量现有文档)。
问题是我想测试上传文件的大小,所以我需要访问temfile
的{{1}}属性,这是一个ActionDispatch :: Http :: UploadedFile
它在我的控制器中工作得很好,但我找不到如何让我的工厂通过。
附件模型:
file
FactoryGirl附件:
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.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
会失败。
奇怪的观察:我在File.open之前显示了create
类,它被视为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
,但我无法使其正常工作,因为临时文件将不存在任何这两种解决方案。
答案 0 :(得分:13)
我看到一个问题。 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