Wie kann ich verspotte Teil eines python-Konstruktor nur zum testen?
Ich bin neu in Python, so dass ich entschuldige mich, wenn dies ist ein Duplikat oder sehr einfache Frage. Ich habe geschrieben eine Koordinator-Klasse, ruft zwei andere Klassen mit dem kafka-python-Bibliothek zum senden/Lesen von Daten von Kafka. Ich möchte schreiben Sie einen unit test für mein Koordinator Klasse aber ich habe Schwierigkeiten, herauszufinden, wie am besten, um darüber zu gehen. Ich hatte gehofft, ich könnte einen alternativen Konstruktor, konnte ich mein verspottet Objekte, aber dies scheint nicht zu funktionieren, da bekomme ich eine Fehlermeldung, dass test_mycoordinator nicht gelöst werden kann. Ich bin dabei zum testen dieser Klasse das der falsche Weg? Gibt es eine pythonic way, ich sollte testen?
Hier ist, was meine Testklasse sieht so weit:
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)
Und hier ist die Klasse, die ich bin versucht zu testen:
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
kommen aus in Ihrem setUpModule
?sorry, ich hatte einen Tippfehler, wenn ich die änderung der Namen habe ich editiert, die Frage zu lösen, die import-Anweisung
InformationsquelleAutor jencoston | 2017-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Notwendigkeit, einen separaten Konstruktor. Mocking patches Ihren code zu ersetzen Objekte mit mocks. Verwenden Sie einfach die
verspotten.patch()
decorator auf Ihre test-Methoden, es passieren in Referenzen auf die erzeugten mock-Objekte.Beide
producer.Producer()
undconsumer.Consumer()
sind dann verspottet sich vor Sie die Instanz erstellen:Also der moment
test_send_data
heißt, diemock.patch()
code ersetzt dieproducer.Producer
Referenz mit einem mock-Objekt. IhreMyCoordinator
- Klasse verwendet dann diese mock-Objekte, anstatt die echten code. Aufrufproducer.Producer()
gibt ein neues mock-Objekt (das gleiche Objekt, dasmock_producer.return_value
Referenzen), etc.Ich habe die Vermutung, dass
producer
undconsumer
sind top-level-Modul-Namen. Wenn Sie nicht sind, geben Sie den vollständigen Pfad importieren. Aus dermock.patch()
Dokumentation:Sie wusste nicht, wo
consumer
kam in Ihrem code; ich habe die Vermutung, dass das der name des Moduls. Wennconsumer
in einem Paket, geben Sie den vollständigen Namen der Importdatei:mock.patch('package.consumer.Consumer')
.mock.patch
wird das Modul importieren und patch-Namen (letztes Teil des Pfads).InformationsquelleAutor Martijn Pieters