Nel mio tentativo di imparare TDD, provando a imparare il test delle unità e l'utilizzo di mock con python. Prendendoci lentamente la mano, ma non sono sicuro se lo sto facendo correttamente. Prevedo: sto stucking usando python 2.4 perché le API del fornitore arrivano come file pyc precompilati a 2.4, quindi sto usando mock 0.8.0 e unittest (non unittest2)Come usare correttamente mock in python con il set-up non più nuovo
Dato questo codice di esempio in 'mymodule.py '
import ldap
class MyCustomException(Exception):
pass
class MyClass:
def __init__(self, server, user, passwd):
self.ldap = ldap.initialize(server)
self.user = user
self.passwd = passwd
def connect(self):
try:
self.ldap.simple_bind_s(self.user, self.passwd)
except ldap.INVALID_CREDENTIALS:
# do some stuff
raise MyCustomException
Ora nel mio test case file 'test_myclass.py', voglio prendere in giro il LDAP oggetto out. ldap.initialize restituisce ldap.ldapobject.SimpleLDAPObject, quindi ho pensato che sarebbe stato il metodo che avrei dovuto prendere in giro.
import unittest
from ldap import INVALID_CREDENTIALS
from mock import patch, MagicMock
from mymodule import MyClass
class LDAPConnTests(unittest.TestCase):
@patch('ldap.initialize')
def setUp(self, mock_obj):
self.ldapserver = MyClass('myserver','myuser','mypass')
self.mocked_inst = mock_obj.return_value
def testRaisesMyCustomException(self):
self.mocked_inst.simple_bind_s = MagicMock()
# set our side effect to the ldap exception to raise
self.mocked_inst.simple_bind_s.side_effect = INVALID_CREDENTIALS
self.assertRaises(mymodule.MyCustomException, self.ldapserver.connect)
def testMyNextTestCase(self):
# blah blah
mi porta ad un paio di domande:
- fa che guardare a destra? :)
- È il modo corretto di provare e prendere in giro un oggetto che viene istanziato all'interno della classe che sto testando?
- È giusto chiamare il decoratore @patch su setUp o causerà strani effetti collaterali?
- Esiste comunque la possibilità di ottenere il mock per sollevare l'eccezione ldap.INVALID_CREDENTIALS senza dover importare l'eccezione nel mio file testcase?
- Dovrei usare patch.object() invece e se sì, come?
Grazie.
1-3) sembra che vada bene a me ... 4) 'importazione ldap' invece e impostare' side_effect = ldap.INVALID_CREDENTIALS'? – Chris
Puoi sempre fare lo stesso test ma con oggetti più semplici fatti da te ... – shackra