如何用factorygirl测试文件上传?

时间:2013-11-15 18:14:50

标签: file-upload ruby-on-rails-3.2 factory-bot

我想测试一个没有使用插件的基本文件上传的模型(我认为当时这是一个坏主意,但我知道我必须处理大量现有文档)。

问题是我想测试上传文件的大小,所以我需要访问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,但我无法使其正常工作,因为临时文件将不存在任何这两种解决方案。

1 个答案:

答案 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