The CSV.foreach method cexpects a string of a file to open. ActionDispatch::Http::UploadedFile has a #tempfile method which is good enough to pass into File.open like CSV.foreach does. Rack::Test::UploadedFile doesn't (and probably won't: rails/rails#799, rack/rack-test#30).
I added it like this:
# in spec/support/add_tempfile_to_test_uploaded_file.rb
class Rack::Test::UploadedFile
def tempfile
@tempfile
end
end