Comment faire pour se moquer d'une partie d'un python constructeur juste pour le test?
Je suis Python, donc je m'excuse si c'est un doublon ou trop simple question. J'ai écrit un coordonnateur de la classe qui appelle deux autres classes qui utilisent la kafka-bibliothèque python pour envoyer/lire des données à partir de Kafka. Je veux écrire un test unitaire pour mon coordonnateur de la classe, mais je vais avoir du mal à déterminer la meilleure façon d'aller à ce sujet. J'espérais que je pourrais faire un autre constructeur que j'ai pu passer mon moqué des objets, mais cela ne semble pas être le travail que j'obtiens une erreur que test_mycoordinator ne peut pas être résolu. Je vais sur le test de cette classe dans le mauvais sens? Est-il un pythonic façon je devrais le tester?
Voici ce que ma classe de test ressemble à ce jour:
import unittest
from mock import Mock
from mypackage import mycoordinator
class MyTest(unittest.TestCase):
def setUpModule(self):
# Create a mock producer
producer_attributes = ['__init__', 'run', 'stop']
mock_producer = Mock(name='Producer', spec=producer_attributes)
# Create a mock consumer
consumer_attributes = ['__init__', 'run', 'stop']
data_out = [{u'dataObjectID': u'test1'},
{u'dataObjectID': u'test2'},
{u'dataObjectID': u'test3'}]
mock_consumer = Mock(
name='Consumer', spec=consumer_attributes, return_value=data_out)
self.coor = mycoordinator.test_mycoordinator(mock_producer, mock_consumer)
def test_send_data(self):
# Create some data and send it to the producer
count = 0
while count < 3:
count += 1
testName = 'test' + str(count)
self.coor.sendData(testName , None)
Et ici, c'est la classe je suis en train de tester:
class MyCoordinator():
def __init__(self):
# Process Command Line Arguments using argparse
...
# Initialize the producer and the consumer
self.myproducer = producer.Producer(self.servers,
self.producer_topic_name)
self.myconsumer = consumer.Consumer(self.servers,
self.consumer_topic_name)
# Constructor used for testing -- DOES NOT WORK
@classmethod
def test_mycoordinator(cls, mock_producer, mock_consumer):
cls.myproducer = mock_producer
cls.myconsumer = mock_consumer
# Send the data to the producer
def sendData(self, data, key):
self.myproducer.run(data, key)
# Receive data from the consumer
def getData(self):
data = self.myconsumer.run()
return data
mycordinator
dans votre setUpModule
?désolé, j'ai eu une faute de frappe quand j'ai changé les noms j'ai édité la question de corriger la déclaration d'importation
OriginalL'auteur jencoston | 2017-04-11
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire de fournir un distinct constructeur. Se moquant de les correctifs à votre code pour remplacer les objets avec des simulacres. Utilisez simplement le
se moquer.patch()
décorateur sur vos méthodes de test, il va passer dans les références à la générées objets fantaisie.Les deux
producer.Producer()
etconsumer.Consumer()
sont ensuite moqué de sortir avant vous créez l'instance:Donc le moment
test_send_data
est appelée, lemock.patch()
code remplace leproducer.Producer
référence à un objet fantaisie. VotreMyCoordinator
classe utilise ensuite ces objets fantaisie plutôt que le code réel. l'appel deproducer.Producer()
renvoie un nouvel objet fantaisie (le même objet quemock_producer.return_value
références), etc.J'ai fait l'hypothèse que
producer
etconsumer
de haut niveau les noms de module. Si elles ne sont pas, fournir le chemin d'importation. À partir de lamock.patch()
documentation:Vous n'avez pas à inclure les cas où
consumer
est venu à partir de votre code; j'ai fait l'hypothèse que c'était le nom du module. Siconsumer
est à l'intérieur d'un package, fournir le nom complet de l'importation:mock.patch('package.consumer.Consumer')
.mock.patch
va importer le module et patch le nom (dernière partie du chemin d'accès).OriginalL'auteur Martijn Pieters