如何解决Python Mock 补丁 ldap3 搜索响应
我正在尝试模拟以下函数,但我不确定如何模拟连接响应:
def get_user_res(user,pass):
res = None
server = Server('my_server')
connnection = Connection(server,user,pass,strategy=SAFE_SYNC,auto_bind=True)
if connection.bind():
connection.search(search_base,search_filter,SUBTREE)
res = connection.response
connection.unbind()
return res
@mock.patch("ldap3.Server")
@mock.patch("ldap3.Connection.response")
def test_get_user_res(mock_connection,mock_server):
mock_connection.return_value = ""
retrived_res = get_user_res("fake_user","fake_password")
expected_res = ""
assert retrived_res == expected_res
解决方法
根本问题是你在嘲笑错误的东西。如果您有一个名为 ldapclient.py
的文件,其中包含您的 get_user_rest
方法,如下所示(请注意,为了让我们在编写测试时更轻松),我已经重写了一些内容:
import ldap3
server = ldap3.Server('my_server')
search_base = 'dc=example,dc=com'
def get_user_res(user,password,search_filter=None):
res = None
connection = ldap3.Connection(
server,user,client_strategy=ldap3.SAFE_SYNC,auto_bind=True)
if connection.bind():
res = connection.search(search_base,search_filter,ldap3.SUBTREE)
connection.unbind()
return res
那么你需要模拟的是 ldap3.Connection
类。但由于您的测试在不同的模块中,您需要调用 @mock.patch('ldapclient.ldap3.Connection)
,假设您的测试定义如下:
import ldap3
from unittest import mock
import ldapclient
@mock.patch("ldapclient.ldap3.Connection")
def test_get_user_res(mock_connection_class):
mock_connection = mock.Mock()
mock_connection.search.return_value = 'fake_return'
mock_connection_class.return_value = mock_connection
retrived_res = ldapclient.get_user_res("fake_user","fake_password")
expected_res = "fake_return"
assert retrived_res == expected_res
这里有几点需要注意:
- 如前所述,因为我们有
import ldapclient
,所以我们需要模拟ldapclient.ldap3.Connection
。 - 我们让
ldap3.Connection
类返回一个新的mock.Mock
对象,因为我们希望能够模拟调用connection = ldap3.Connection(...)
时返回的对象的方法 - 我们使
search
方法返回一个假值,以确保它按预期调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。