如何用factorygirl测试文件上传?

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)