Rails功能测试用例并将文件上传到ActionDispatch :: Http :: UploadFile

Kev*_*tre 16 ruby gem ruby-on-rails functional-testing

我正在为远程存储文件的Rails应用程序添加测试.我正在使用默认的Rails功能测试.如何向他们添加文件上传?我有:

test "create valid person" do
  post(:create, :person => { :avatar => fixture_file_upload('avatar.jpeg') })
end
Run Code Online (Sandbox Code Playgroud)

这由于某种原因上传a Tempfile并导致AWS/S3gem失败:

NoMethodError: undefined method `bytesize' for Tempfile
Run Code Online (Sandbox Code Playgroud)

他们是否可以ActionDispatch::Http::UploadedFile通过网络浏览器进行测试,以获得测试使用和执行更多的测试?是fixture_file_upload测试上传文件到控制器的方式吗?如果是这样,为什么它不像浏览器一样工作?

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

Ste*_*man 56

我使用s3 gem而不是aws/s3 gem.主要原因是不支持欧洲桶,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 }
Run Code Online (Sandbox Code Playgroud)

  • +1,使用ActionDispatch :: Http :: UploadedFile更安全,因为Rack :: Test :: Uploaded与Rails不兼容API. (3认同)
  • 该属性是`content_type`但你需要传递密钥:键入初始化程序.(http://stackoverflow.com/questions/23899860/actiondispatchhttpuploadedfile-content-type-not-being-initialized-in-rspec-t) (3认同)
  • `upload` 在参数中以 `"#<ActionDispatch::Http::UploadedFile:0x007f9b6642a208>"` 字符串形式出现 (2认同)