W mojej próbie nauczenia się TDD, próbując nauczyć się testowania jednostek i używania makiety z pytonem. Powoli się do tego przyzwyczaja, ale nie wiem, czy robię to poprawnie. Ostrzeżony: Utknąłem przy użyciu Pythona 2.4, ponieważ API dostawcy przychodzą jako wstępnie skompilowane pliki 2.4 Pyc, więc używam makiety 0.8.0 i unittest (nie unittest2)Jak poprawnie używać makiety w python z unittest setUp
Podany tutaj przykładowy kod w '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
teraz w moim przypadku testowego pliku«test_myclass.py», chcę drwić LDAP obiektu na zewnątrz. ldap.initialize zwraca ldap.ldapobject.SimpleLDAPObject, więc pomyślałem, że to będzie metoda, którą będę musiał wyszydzić.
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
prowadzi mnie do kilku pytań:
- to wygląda prawda? :)
- Czy to właściwy sposób na próbowanie i wyśmiewanie obiektu, który zostanie zainicjowany w klasie, którą testuję?
- Czy można wywoływać dekorator @patch na setUp, czy może spowoduje to dziwne efekty uboczne?
- Czy mimo to można próbować podnieść wyjątek ldap.INVALID_CREDENTIALS bez konieczności importowania wyjątku do mojego pliku testowego?
- Czy zamiast tego powinienem używać patch.object(), a jeśli tak, to w jaki sposób?
Dzięki.
1-3) wydaje się dobrze do mnie ... 4) 'import ldap' zamiast i ustawić' side_effect = ldap.INVALID_CREDENTIALS'? – Chris
Zawsze można wykonać ten sam test, ale z prostymi obiektami wykonanymi przez siebie ... – shackra