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 查看哈希值)