class_docstr: Make sure user-visible error messages look correct.
  
  These errors are a little annoying to test, but they're important! So we
  are testing them word-for-word as much as possible. Even though this
  *feels* like an antipattern, it isn't: we're making sure the codepaths
  that pull useful debug info from the code are working.
  
  TODO: parameterize these tests for both memo + singleton
class_docstr_tok: ["Make","sure","user-visible","error","messages","look","correct",".","These","errors","are","a","little","annoying","to","test",",","but","they","'re","important","!","So","we","are","testing","them","word-for-word","as","much","as","possible",".","Even","though","this","*","feels","*","like","an","antipattern",",","it","is","n't",":","we","'re","making","sure","the","codepaths","that","pull","useful","debug","info","from","the","code","are","working",".","TODO",":","parameterize","these","tests","for","both","memo","+","singleton"]
code: def test_unevaluated_dataframe_error(self, type_name):
      if "snowpark.table.Table" in type_name:
          to_return = snowpark_mocks.Table()
      elif "snowpark.dataframe.DataFrame" in type_name:
          to_return = snowpark_mocks.DataFrame()
      else:
          to_return = (
              pyspark_mocks.create_pyspark_dataframe_with_mocked_personal_data()
          )
  
      @st.experimental_memo
      def unevaluated_dataframe_func():
          return to_return
  
      with self.assertRaises(UnevaluatedDataFrameError) as cm:
          unevaluated_dataframe_func()
  
      ep = ExceptionProto()
      exception.marshall(ep, cm.exception)
  
      self.assertEqual(ep.type, "UnevaluatedDataFrameError")
  
      expected_message = "Please call `collect()` or `to_pandas()` on the dataframe before returning it"
      self.assertTrue(expected_message in ep.message)
      self.assertEqual(ep.message_is_markdown, True)
      self.assertEqual(ep.is_warning, False)
  
file_path: streamlit/lib/tests/streamlit/runtime/caching/cache_errors_test.py
imports: import threading
  from parameterized import parameterized
  import streamlit
  from streamlit.elements import exception
  from streamlit.proto.Exception_pb2 import Exception
  from streamlit.runtime.caching.cache_errors import UnevaluatedDataFrameError, UnhashableParamError, UnserializableReturnValueError, get_return_value_type
  from streamlit.runtime.caching.cache_utils import UNEVALUATED_DATAFRAME_TYPES
  from tests import testutil
  from tests.delta_generator_test_case import DeltaGeneratorTestCase
  from tests.streamlit import pyspark_mocks, snowpark_mocks
label_desc: Use image node_id 3 for calling the CacheErrorsTest obj's underlying member method code with example usage: obj.test_unevaluated_dataframe_error(type_name) and returns: to_return