Python:assertRaises()在引发时没有捕获ldap.SERVER_DOWN错误

Python: assertRaises( ) not catching ldap.SERVER_DOWN error when raised

感谢您的帮助。

我尝试测试以下类方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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())

到目前为止,一切都很好。但是当我执行单元测试(通过nose)时,从assertraises语句调用test_extractor._get_ldap_connection(),但是没有捕获异常,测试失败。

以下是输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vagrant@precise64:/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

帮助我!


您没有正确使用assertRaises

您可以将其用作上下文管理器:

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

或者通常的方法(self.assertRaises(exception, function, args)

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

还可以看到:

  • 如何将单元测试的assertraises()正确地用于非类型对象?
  • 在python中测试-如何在使用unittest的测试中使用断言引发?
  • 文档

不调用,只传递函数(方法)本身;删除()

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

或者,如果您使用的是最新版本的python(python 2.7+/python 3.1+),则可以使用with self.assertRaises(..)表单:

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