В моей попытке узнать TDD, пытаясь изучить модульное тестирование и использовать mock с python. Постепенно выискивайте его, но не уверены, правильно ли я это делаю. Предупреждаем: я использую python 2.4, потому что API-интерфейс поставщика поставляется в виде предварительно скомпилированных файлов 2.4 pyc, поэтому я использую mock 0.8.0 и unittest (не unittest2)Как правильно использовать mock в python с unittest setUp
С учетом этого примера кода в '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
Теперь в моем тестовом дела „test_myclass.py“, я хочу, чтобы дразнить объект LDAP вне. ldap.initialize возвращает ldap.ldapobject.SimpleLDAPObject, поэтому я решил, что это будет метод, который мне придется издеваться.
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
ведет меня пару вопросов:
- это выглядит не так ли? :)
- Это правильный способ попробовать и издеваться над объектом, который создается в классе, который я тестирую?
- Можно ли назвать декоратор @patch на setUp или это вызовет странные побочные эффекты?
- Есть ли все-таки, чтобы получить mock, чтобы поднять исключение ldap.INVALID_CREDENTIALS без необходимости импортировать исключение в файл testcase?
- Должен ли я использовать patch.object() вместо этого, и если да, то как?
Спасибо.
1-3) Кажется, хорошо для меня ... 4) 'импорта ldap' вместо и установить' side_effect = ldap.INVALID_CREDENTIALS'? – Chris
Вы всегда можете сделать тот же тест, но с более простыми объектами, сделанными вами самим ... – shackra