Jér*_*mie 6 file-upload ruby-on-rails-3.2 factory-bot
我想测试一个没有使用插件的基本文件上传的模型(我认为当时这是一个坏主意,但我知道我必须处理大量现有文档).
问题是我想测试上传文件的大小,所以我需要访问其temfile属性file是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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,a FactoryGirl.build :attachment会成功,但create会失败.
奇怪的观察:我self.file在File.open之前显示了类,它被视为a 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>
Run Code Online (Sandbox Code Playgroud)
我已经阅读了其他帖子,建议我应该使用Rack::Test::UploadedFile或者fixture_file_upload我无法使其工作,因为临时文件将不存在任何这两种解决方案.
Ric*_*ard 13
我看到一个问题.UpLoadedFile(:tempfile)期望文件不是字符串.对于您的观察,它从未更改为您将其定义为String的String.你需要用a围绕它,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
Run Code Online (Sandbox Code Playgroud)