code: def testInvalidComponentSpec_WrongProperties(self):
      with self.assertRaisesRegex(
          TypeError, "PARAMETERS should be a dict"
      ):
  
          class InvalidComponentSpecA(ComponentSpec):
              PARAMETERS = object()
              INPUTS = {}
              OUTPUTS = {}
  
      with self.assertRaisesRegex(TypeError, "INPUTS should be a dict"):
  
          class InvalidComponentSpecB(ComponentSpec):
              PARAMETERS = {}
              INPUTS = object()
              OUTPUTS = {}
  
      with self.assertRaisesRegex(
          TypeError, "OUTPUTS should be a dict"
      ):
  
          class InvalidComponentSpecC(ComponentSpec):
              PARAMETERS = {}
              INPUTS = {}
              OUTPUTS = object()
  
imports: import json
  import sys
  from typing import Dict, List
  import unittest
  import tensorflow
  from tfx.dsl.placeholder import placeholder
  from tfx.proto import example_gen_pb2
  from tfx.types import artifact
  from tfx.types import channel
  from tfx.types import component_spec
  from tfx.types.component_spec import ChannelParameter
  from tfx.types.component_spec import ComponentSpec
  from tfx.types.component_spec import ExecutionParameter
  from tfx.types.standard_artifacts import Examples
  from tfx.utils import proto_utils
  from google.protobuf import json_format
  from google.protobuf import text_format
label_desc: Use image node_id 6 for calling the ComponentSpecTest obj's underlying member method code with example usage: obj.testInvalidComponentSpec_WrongProperties() without return types