【问题标题】:How to test file upload with factorygirl?如何使用 factorygirl 测试文件上传?
【发布时间】:2014-01-31 05:03:37
【问题描述】:

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

问题是我想测试上传文件的大小,所以我需要访问filetemfile属性,这是一个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

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 上出现错误:它已更改为字符串。

puts self.file.class.inspect
=> ActionDispatch::Http::UploadedFile

f.write(self.file.read) => NoMethodError: undefined method `read' for #<String:0x007ff50f70f6a0>

我已阅读其他建议我应该使用 Rack::Test::UploadedFilefixture_file_upload 的帖子,但我无法使其工作,因为这两种解决方案都不存在临时文件。

【问题讨论】:

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


    【解决方案1】:

    我看到一个问题。 UpLoadedFile (:tempfile) 需要一个文件而不是字符串。对于您的观察,它从未更改为您将其定义为字符串的字符串。您需要用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
    

    【讨论】:

    • 你让我很开心!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2021-01-27
    • 2019-04-30
    • 2017-10-19
    • 2015-12-29
    相关资源
    最近更新 更多