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

问题是我想测试上传文件的大小,所以我需要访问temfilefile属性,它是一个ActionDispatch::Http::UploadedFile

它在我的 Controller 中效果很好,但是我找不到如何使我的工厂通过的方法。

附件型号:

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上出现错误:它已更改为String。
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,但我无法使其正常工作,因为这两个解决方案中的任何一个都不存在tempfile。

请您参考如下方法:

我看到一个问题。 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 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!