code: def test_moco_v2_app_train_test_30_views(self, root_dir: str) -> None:
      train_app = self.get_train_app(
          root_dir=root_dir, fast_dev_run=False, logger=False
      )
      output = train_app.train()
      self.assertIsNotNone(output)
      output = train_app.test()
      self.assertIsNotNone(output)
  
      video_clips_cnts = getattr(
          train_app.module, "video_clips_cnts", None
      )
      num_ensemble_views = getattr(
          train_app.datamodule, "num_ensemble_views", 10
      )
      num_spatial_crops = getattr(
          train_app.datamodule, "num_spatial_crops", 3
      )
      self.assertIsNotNone(video_clips_cnts)
      for _, sample_cnts in video_clips_cnts.items():
          self.assertEqual(
              num_ensemble_views * num_spatial_crops, sample_cnts
          )
  
imports: from torchrecipes.core.base_train_app import BaseTrainApp
  from util import BaseTrainAppTestCase, create_small_kinetics_dataset, run_locally, tempdir
label_desc: Use image node_id 2 for calling the TestMOCOV2TrainApp obj's underlying member method code with example usage: obj.test_moco_v2_app_train_test_30_views(root_dir) without return types