gpt4 book ai didi

python - 模拟 xmlrpc.client 方法 python

转载 作者:太空狗 更新时间:2023-10-29 21:04:57 27 4
gpt4 key购买 nike

我正在学习单元测试,但我很难理解如何为单元测试模拟函数。我已经回顾了许多操作方法和示例,但是这个概念的转移不足以让我在我的代码中使用它。我希望在我拥有的实际代码示例中使用它会有所帮助。

在这种情况下,我试图模拟 isTokenValid。

这是我想要模拟的示例代码。

<in library file>

import xmlrpc.client as xmlrpclib

class Library(object):
def function:
#...
AuthURL = 'https://example.com/xmlrpc/Auth'
auth_server = xmlrpclib.ServerProxy(AuthURL)
socket.setdefaulttimeout(20)
try:
if pull == 0:
valid = auth_server.isTokenValid(token)
#...

在我的单元测试文件中有

import library

class Tester(unittest.TestCase):
@patch('library.xmlrpclib.ServerProxy')
def test_xmlrpclib(self, fake_xmlrpclib):
assert 'something'

我如何模拟“函数”中列出的代码? token 可以是任何数字作为字符串,有效的是一个 int(1)

最佳答案

首先,您可以而且应该模拟xmlrpc.client.ServerProxy;您的库将 xmlrpc.client 作为新名称导入,但它仍然是相同的模块对象,因此您的库中的 xmlrpclib.ServerProxyxmlrpc.client.ServerProxy 导致同一个对象。

接下来,查看对象的使用方式,并查找calls,即(..) 语法。您的图书馆使用这样的服务器代理:

# a call to create an instance
auth_server = xmlrpclib.ServerProxy(AuthURL)
# on the instance, a call to another method
valid = auth_server.isTokenValid(token)

所以这里有一个链,mock被调用,然后返回值用来寻找另一个也被调用的属性。模拟时,您需要寻找相同的链;使用 Mock.return_value attribute为了这。默认情况下,当您调用模拟时会返回一个新的模拟实例,但您也可以设置测试值。

因此,要测试您的代码,您需要影响 auth_server.isTokenValid(token) 返回的内容,并测试您的代码是否正常工作。您可能还想断言正确的 URL 已传递到 ServerProxy 实例。

为不同的结果创建单独的测试。也许 token 在一种情况下有效,而在另一种情况下无效,而您想要测试这两种情况:

class Tester(unittest.TestCase):
@patch('xmlrpc.client.ServerProxy')
def test_valid_token(self, mock_serverproxy):
# the ServerProxy(AuthURL) return value
mock_auth_server = mock_serverproxy.return_value
# configure a response for a valid token
mock_auth_server.isTokenValid.return_value = 1

# now run your library code
return_value = library.Library().function()

# and make test assertions
# about the server proxy
mock_serverproxy.assert_called_with('some_url')
# and about the auth_server.isTokenValid call
mock_auth_server.isTokenValid.assert_called_once()
# and if the result of the function is expected
self.assertEqual(return_value, 'expected return value')

@patch('xmlrpc.client.ServerProxy')
def test_invalid_token(self, mock_serverproxy):
# the ServerProxy(AuthURL) return value
mock_auth_server = mock_serverproxy.return_value
# configure a response; now testing for an invalid token instead
mock_auth_server.isTokenValid.return_value = 0

# now run your library code
return_value = library.Library().function()

# and make test assertions
# about the server proxy
mock_serverproxy.assert_called_with('some_url')
# and about the auth_server.isTokenValid call
mock_auth_server.isTokenValid.assert_called_once()
# and if the result of the function is expected
self.assertEqual(return_value, 'expected return value')

关于python - 模拟 xmlrpc.client 方法 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41457068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com