ruby-on-rails – Rails功能测试用例并将文件上传到ActionDispatch :: Http :: UploadFile

我正在向远程存储文件的Rails应用程序添加测试.我正在使用认的Rails功能测试.如何添加文件上传到他们?我有
test "create valid person" do
  post(:create,:person => { :avatar => fixture_file_upload('avatar.jpeg') })
end

由于某种原因上传了Tempfile并导致AWS / S3 gem失败:

NoMethodError: undefined method `bytesize' for Tempfile

他们有什么办法可以让测试使用Actiondispatch :: Http :: UploadedFile,并在使用网络浏览器进行测试时执行更多的功能?是fixture_file_upload的方式来测试将文件上传到控制器?如果是这样,为什么它不像浏览器那样工作?

作为一个说明,我真的不想切换测试框架.谢谢!

解决方法

我使用 s3 gem而不是aws / s3宝石.其主要原因是不支持欧洲桶,而aws / s3的开发似乎已经停止.

如果要测试文件上传比使用fixtures_file_upload方法是正确的,它直接映射到Rack :: Test :: UploadedFile.new(如果测试文件不在fixtures文件夹中,可以使用它).

但是我也注意到,Rack :: Test :: uploaded文件对象的行为与Actiondispatch :: Http :: UploadedFile对象(这是上传文件类)不完全相同.基本方法(original_filename,read,size,…)都可以正常工作,但在使用文件方法时有一些差异.所以将控制器限制在这方法上,一切都会很好.

一个可能的解决方案是创建一个Actiondispatch :: Http :: uploaded文件对象,并使用它:

upload = Actiondispatch::Http::UploadedFile.new({
  :filename => 'avatar.jpeg',:content_type => 'image/jpeg',:tempfile => File.new("#{Rails.root}/test/fixtures/avatar.jpeg")
})

post :create,:person => { :avatar => upload }

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...