跳转到主要内容

LDAPObject的实现,用于在unittests中模拟ldap服务器。

项目描述

本模块的目的是为您的单元测试提供一个简单的方式来模拟ldap后端服务器。它允许您预先定义一组可查询或为ldap查询设置固定返回值的目录条目。它作为python-ldap模块中的LDAPObject类的直接替换。它实现了该类允许的方法的一个子集。

本模块实现了MockLDAP类,该类既充当LDAPObject又充当ldap模块。大部分代码和设计都取自Peter Sagerson的优秀的django-auth-ldap模块。

安装

从PyPI安装最新版本

$ pip install fakeldap

在开发中运行测试

如果您已本地克隆了存储库

$ git clone git://github.com/zulip/fakeldap.git

并对代码进行了修改,请确保已安装pytest

$ pip install pytest

并且您可以使用以下命令运行测试

$ pytest tests.py

用法

MockLDAP类替换了python-ldap模块中的LDAPObject。使用它的最简单方法是覆盖ldap.initialize以返回MockLDAP而不是LDAPObject。下面的示例使用Michael Foord的Mock库来实现这一点

import unittest
from mock import patch
from fakeldap import MockLDAP


_mock_ldap = MockLDAP()

class YourTestCase(unittest.TestCase):
    def setUp(self):
        # Patch where the ldap library is used:
        self.ldap_patcher = patch('app.module.ldap.initialize')
        self.mock_ldap = self.ldap_patcher.start()
        self.mock_ldap.return_value = _mock_ldap

    def tearDown(self):
        _mock_ldap.reset()
        self.mock_ldap.stop()

mock ldap对象实现了以下ldap操作

  • simple_bind_s

  • search_s

  • compare_s

  • modify_s

  • delete_s

  • add_s

  • rename_s

以下是如何使用MockLDAP与固定返回值的示例

def test_some_ldap_group_stuff(self):
    # Define the expected return value for the ldap operation
    return_value = ("cn=testgroup,ou=group,dc=30loops,dc=net", {
        'objectClass': ['posixGroup'],
        'cn': 'testgroup',
        'gidNumber': '2030',
    })

    # Register a return value with the MockLDAP object
    _mock_ldap.set_return_value('add_s',
        ("cn=testgroup,ou=groups,dc=30loops,dc=net", (
            ('objectClass', ('posixGroup')),
            ('cn', 'testgroup'),
            ('gidNumber', '2030'))),
        (105,[], 10, []))

    # Run your actual code, this is just an example
    group_manager = GroupManager()
    result = group_manager.add("testgroup")

    # assert that the return value of your method and of the MockLDAP
    # are as expected, here using python-nose's eq() test tool:
    self.assertEqual(return_value, result)

    # Each actual ldap call your software makes gets recorded. You could
    # prepare a list of calls that you expect to be issued and compare it:
    called_records = []

    called_records.append(('simple_bind_s',
        {'who': 'cn=admin,dc=30loops,dc=net', 'cred': 'ldaptest'}))

    called_records.append(('add_s', {
        'dn': 'cn=testgroup,ou=groups,dc=30loops,dc=net",
        'record': [
            ('objectClass', ['posixGroup']),
            ('gidNumber', '2030'),
            ('cn', 'testgroup'),
            ]}))

    # And again test the expected behaviour
    self.assertEqual(called_records, _mock_ldap.ldap_methods_called_with_arguments())

除了为特定调用固定返回值之外,您还可以使用条目目录来模拟完整的ldap服务器

# Create an instance of MockLDAP with a preset directory
tree = {
    "cn=admin,dc=30loops,dc=net": {
            "userPassword": "ldaptest"
    }
}
mock_ldap = MockLDAP(tree)

record = [
    ('uid', 'crito'),
    ('userPassword', 'secret'),
]
# The return value I expect when I add another record to the directory
self.assertEqual(
    (105,[],1,[]),
    mock_ldap.add_s("uid=crito,ou=people,dc=30loops,dc=net", record)
)

# The expected directory
directory = {
    "cn=admin,dc=30loops,dc=net": {"userPassword": "ldaptest"},
    "uid=crito,ou=people,dc=30loops,dc=net": {
        "uid": "crito", "userPassword": "secret"}
}
# Compare the expected directory with the MockLDAP directory
self.assertEqual(directory, mock_ldap.directory)

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

fakeldap-0.6.6.tar.gz (8.4 kB 查看哈希值)

上传时间

构建分发

fakeldap-0.6.6-py2.py3-none-any.whl (8.3 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面