A chaque fois qu'un fichier importe import greengrasssdk
, les tests unitaires échouent, car le module greengrass_common
n'existe pas sur ma machine locale et je ne peux pas l'installer via pip.
J'exécute les tests avec PyCharm. Le lambda de Greengrass, que j'essaie de tester, ne s'exécute pas localement à cause du même problème de dépendance (même exception). Mais dès que le lambda est poussé vers greengrass, cela fonctionne très bien.
Voici l'exception:
# NONE OF THE THREE PATCH WORK Not in combination nor single @mock.patch('greengrass_common') @mock.patch('greengrass_common.function_arn_fields') @mock.patch('greengrasssdk') def test_that(self): pass
Voici un exemple de code simplifié: p>
import unittest import mock import function
Je reçois le message d'erreur suivant sur le test (Le test est exclu dans un dossier de test, mais aucun autre problème de dépendance n'a encore été montré - j'écris ceci parce que certains développeurs mettent leur tests dans le fichier de code python. J'ai entendu dire que des tests en dehors du fichier de code source pouvaient entraîner des problèmes d'importation. Bien que ce cas soit différent car il se produit également dans le fichier de code d'origine.)
import greengrasssdk import logging greengrass_iot_client = greengrasssdk.client('iot-data') logger = logging.getLogger('logger') def handler(event, context): logger.info('Event handler invoked with event: ' + str(event))
3 Réponses :
Vous pouvez importer greengrasssdk conditionnellement si vous détectez que vous utilisez Greengrass et utilisez boto3 si vous ne l'êtes pas. J'ai écrit un test rapide qui fonctionne pour moi ici et qui ressemble à ceci:
import socket host = socket.gethostname() client = None # Create an IoT data client with Greengrass SDK on Greengrass, boto3 locally if host == 'sandbox': import greengrasssdk client = greengrasssdk.client('iot-data') else: import boto3 client = boto3.client('iot-data')
Essentiellement, vérifiez si le nom d'hôte est signalé comme étant 'sandbox', puis utilisez le SDK Greengrass, sinon utilisez boto3.
J'ai également eu ce problème et utilisez le correctif dans mon fichier conftest.py
pour appliquer le correctif sur le SDK Greengrass, par exemple
conftest.py
< pre> XXX Une fois que vous avez défini MockGreengrassSdk
comme MagicMock
, vous pouvez alors simuler n'importe quelle méthode que vous voulez. La seule chose dont je ne suis pas sûr est de savoir comment vous changeriez cela par test si vous vouliez des résultats différents du SDK par test.
La façon dont je me suis débrouillé est de créer une façade sur le greengrasssdk
sur lequel je peux ensuite simuler les méthodes. Dans ce cas, cette façade doit importer greengrasssdk
où le code ci-dessus empêchera vos tests d'échouer.
En résumé:
Créez une façade sur les méthodes greengrasssdk
que vous souhaitez utiliser.
Dans la façade, importez le greengrasssdk
.
Utilisez le code du patcher dans un fichier conftest.py
(comme ci-dessus) pour appliquer le correctif sur le SDK Greengrass.
J'espère que cela vous aidera.
Je viens de rencontrer le même problème et pour moi, cela a fonctionné en entourant l'importation avec une instruction try except.
try: import greengrasssdk client = greengrasssdk.client('iot-data') except Exception as e: import boto3 client = boto3.client('iot-data')