Как правильно использовать макет в Python с помощью unittest setUp

В моей попытке изучить TDD, пытаясь научиться модульному тестированию и используя макет с python. Медленно осваиваюсь, но не уверен,я делаю это правильно. Предупрежден: яя застрял с использованием Python 2.4, потому что API поставщикаs поставляется как предварительно скомпилированные файлы 2.4 pyc, так что ям, используя макет 0.8.0 и unittest (не unittest2)

Учитывая этот пример кода в '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

Подводит меня к паре вопросов:

Это выглядит правильно? :)Является ли это правильным способом попытаться издеваться над объектом, который создается в классе I?м тестирование?Можно ли вызывать декоратор @patch в setUp или это вызовет странные побочные эффекты?Есть ли способ получить исключение ldap.INVALID_CREDENTIALS без необходимости импортировать исключение в мой файл теста?Должен ли я использовать patch.object () и если да, то как?

Благодарю.

Ответы на вопрос(5)

Ваш ответ на вопрос