richtige Weg, python mock __init__ () - Methode zurückgibt, fake Klasse
Versuchen zu verspotten out-rufe zu pyazure Bibliothek für django testen, aber ich kann nicht herausfinden, wie man mock aus den PyAzure Konstruktor der Klasse, so dass es nicht zu einem TypeError. Gibt es eine bessere Art und Weise zu nähern Verspottung aus einer access-Bibliothek, erzeugt ein connection-Objekt?
Alles, was ich habe versucht, andere als None erzeugt einen TypeError, das heißt, ich kann nicht wirklich auch nur ansatzweise zu testen, die von der PyAzure Methoden für die Verbindung mit tatsächlichen Werte zurückgeben. Was ist der beste Weg, Sie zu ersetzen working-class mit einem gefälschten Klasse mit mock?
Test-Fehler:
======================================================================
ERROR: test_management_certificate_connect (azure_cloud.tests.ViewsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/bschott/Source/django-nimbis/apps/azure_cloud/tests.py", line 107, in test_management_certificate_connect
self.cert1.connect()
File "/Users/bschott/Source/django-nimbis/apps/azure_cloud/models.py", line 242, in connect
subscription_id=self.subscription.subscription_id)
TypeError: __init__() should return None, not 'FakeAzure'
----------------------------------------------------------------------
tests.py:
class ViewsTest(TestCase):
def setUp(self):
...
self.cert1 = ManagementCertificate.objects.create(
name="cert1",
subscription=self.subscription1,
management_cert=File(open(__file__), "cert1.pem"),
owner=self.user1)
...
class FakeAzure(object):
""" testing class for azure """
def list_services(self):
return ['service1', 'service2', 'service3']
def list_storages(self):
return ['storage1', 'storage2', 'storage3']
@mock.patch.object(pyazure.PyAzure, '__init__')
def test_management_certificate_connect(self, mock_pyazure_init):
mock_pyazure_init.return_value = self.FakeAzure()
self.cert1.connect()
assert mock_pyazure_init.called
models.py
class ManagementCertificate(models.Model):
# support connection caching to azure
_cached_connection = None
def connect(self):
"""
Connect to the management interface using these credentials.
"""
if not self._cached_connection:
self._cached_connection = pyazure.PyAzure(
management_cert_path=self.management_cert.path,
subscription_id=self.subscription.subscription_id)
logging.debug(self._cached_connection)
return self._cached_connection
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie haben offenbar eine falsche Vorstellung darüber, was
__init__()
tut. Sein Zweck ist, initialisieren Sie eine Instanz, wurde bereits zuvor erstellt. Das erste argument__init__()
istself
, das ist die Instanz, damit Sie sehen können, es war bereits zugewiesen, wenn__init__()
genannt wird.Es ist eine Methode
__new__()
, die aufgerufen wird, bevor__init__()
zu erstellen, die die aktuelle Instanz. Ich denke, es wäre viel einfacher, wenn zu ersetzen die ganze Klasse durch eine mock-Klasse anstelle der Spott einzelner Methoden.