2017-09-05 1 views
-2

J'ai la fonction suivante pour laquelle je voudrais écrire des tests.Test de l'unité Python pour le code contenant la déclaration

def _find_latest_backup(self): 
    """ 
    Find the latest backup in S3 bucket 
    """ 
    aem_instance_type = self.instance_of 
    if aem_instance_type == 'standby': 
     aem_instance_type = 'author' 

    with S3Bucket(name=self.s3_bucket) as bucket: 
     objects = bucket.objects.filter(
      Prefix=self.s3_folder + "/aem_" + aem_instance_type, 
     ) 
     print objects 
     try: 
      return max(objects, key=attrgetter('last_modified')).Object() 
     except ValueError: 
      self.logger.info("No backups found in %s/aem_%s", self.s3_folder, aem_instance_type) 

Mon unittest ressemble à ceci,

@pytest.mark.parametrize('s3_obj_summaries,latest_key', [ 
     (
      [ 
       MockS3ObjectSummary(
        key='aem-cpp-dev-01/backup1', 
        last_modified=datetime(2017, 1, 10, 15, 0) 
       ), 
       MockS3ObjectSummary(
        key='aem-cpp-dev-01/backup2', 
        last_modified=datetime(2017, 2, 11, 15, 0) 
       ), 
       MockS3ObjectSummary(
        key='aem-cpp-dev-01/backup3', 
        last_modified=datetime(2017, 3, 12, 15, 0) 
       ), 
       MockS3ObjectSummary(
        key='aem-cpp-dev-01/backup4', 
        last_modified=datetime(2017, 4, 12, 15, 0) 
       ), 
      ], 
      "aem-cpp-dev-01/backup4" 
     ), 
    ]) 
    def test_find_latest_backup(self, mocker, s3_obj_summaries, latest_key): 
     """ Test getting the latest backup file """ 
     bucket = mocker.patch('aem_management.restore.S3Bucket') 
     bucket.__enter__.objects.filter.return_value = True 
     restore_manager = blank_restore_manager() 
     assert restore_manager._find_latest_backup().key == latest_key 

Cependant je ne suis pas la valeur correcte return_value. Sortie je vois est

with mocker.patch('aem_management.restore.S3Bucket', return_value=mock_bucket) as bucket: 
      restore_manager = blank_restore_manager() 
>   assert restore_manager._find_latest_backup().key == latest_key 
E   AttributeError: 'NoneType' object has no attribute 'key' 

C'est la première fois que je suis à écrire des tests pour le code contenant avec déclaration et dois-je faire quelque chose de différent pour faire ce travail?

Un grand merci,

Répondre

1
à la place

Mock boto3.resource testera sur le seau des ressources attributs et fonctions.

@pytest.mark.parametrize('s3_obj_summaries,latest_key', [ 
    (
     [ 
      MockS3ObjectSummary(
       key='aem-cpp-dev-01/backup1', 
       last_modified=datetime(2017, 1, 10, 15, 0) 
      ), 
      ... 
     ], 
     "aem-cpp-dev-01/backup4" 
    ), 
]) 
@mock.patch("boto3.resource") 
def test_find_latest_backup(self, s3_obj_summaries, latest_key, mock_boto): 
    """ Test getting the latest backup file """ 
    mock_bucket = mock.Mock() 
    mock_bucket.objects.filter.return_value = s3_obj_summaries 
    mock_boto.return_value.Bucket = mock_bucket 
    restore_manager = blank_restore_manager() 
    assert restore_manager._find_latest_backup().key == latest_key