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
InformationsquelleAutor bfschott | 2012-03-12
Schreibe einen Kommentar