2013-08-21 2 views
1

Спасибо за вашу помощь заранее.Python: assertRaises() не поймает ошибку ldap.SERVER_DOWN при поднятии

У меня есть следующий метод класса, который я пытаюсь проверить:

def _get_ldap_connection(self): 
    """ 
    Instantiate and return simpleldap.Connection object. 

    Raises: 
     ldap.SERVER_DOWN: When ldap_url is invalid or server is 
     not reachable. 

    """ 
    try: 
     ldap_connection = simpleldap.Connection(
      self.ldap_url, encryption='ssl', require_cert=False, 
      debug=False, dn=self.ldap_login_dn, 
      password=self.ldap_login_password) 

    except ldap.SERVER_DOWN: 
     raise ldap.SERVER_DOWN(
      "The LDAP server specified, {}, did not respond to the " 
      "connection attempt.".format(self.ldap_url)) 

И вот UnitTest:

def test__get_ldap_connection(self): 
    """ 
    VERY IMPORTANT: This test refers to your actual config.json file. 
    If it is correctly populated, you can expect this test to fail. 

    """ 

    # Instantiate Class 
    test_extractor = SakaiLdapExtractor('config_files/config.json') 

    # Monkey with ldap server url to ensure error. 
    test_extractor.ldap_url = "invalid_ldap_url" 

    self.assertRaises(
     ldap.SERVER_DOWN, test_extractor._get_ldap_connection()) 

До сих пор, так хорошо. Но когда я выполняю модульные тесты (через нос), test_extractor._get_ldap_connection() вызывается из оператора assertRaises, но исключение не попадает и тест не выполняется.

Вот результат:

[email protected]:/vagrant/sakai-directory-integration$ nosetests 
...E.. 
====================================================================== 
ERROR: VERY IMPORTANT: This test refers to your actual config.json file. 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/vagrant/sakai-directory-integration/test_sakaiLdapExtractor.py", line 77, in test__get_ldap_connection 
    ldap.SERVER_DOWN, test_extractor._get_ldap_connection()) 
    File "/vagrant/sakai-directory-integration/sakai_ldap_integration.py", line 197, in _get_ldap_connection 
    "connection attempt.".format(self.ldap_url)) 
SERVER_DOWN: The LDAP server specified, invalid_ldap_url, did not respond to the connection attempt. 

---------------------------------------------------------------------- 
Ran 6 tests in 0.159s 

меня Помощь!

ответ

1

Не вызывайте, просто пропустите функцию (метод); падение ():

self.assertRaises(
    ldap.SERVER_DOWN, test_extractor._get_ldap_connection) 

В качестве альтернативы, вы можете использовать with self.assertRaises(..) форму, если вы используете последнюю версию питона (Python 2.7+/Python 3.1+):

with self.assertRaises(ldap.SERVER_DOWN): 
    test_extractor._get_ldap_connection() 
+0

** Да **, конечно. Как глупо со мной. Спасибо @falsetru. Я буду отмечать ваш ответ как правильный. – eikonomega

+0

@eikonomega, добро пожаловать. Это была одна из моих любимых (?) Ошибок. ;) – falsetru

1

Вы не используете assertRaises правильно.

Вы можете использовать его в качестве контекста менеджера:

with self.assertRaises(ldap.SERVER_DOWN): 
    test_extractor._get_ldap_connection() 

или обычным способом (self.assertRaises(exception, function, args):

self.assertRaises(ldap.SERVER_DOWN, test_extractor._get_ldap_connection) 

Также смотрите: