我正在向远程存储文件的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 }