嘲弄xmlrpc.clientpython方法

2024-10-01 00:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习单元测试,但是我很难理解如何模拟单元测试函数。我已经复习了许多操作方法和示例,但是这个概念的传递还不够,我无法在代码中使用它。我希望在一个实际的代码示例中使用它会有所帮助。在

在这种情况下,我试图嘲笑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)
        #...

在我的单元测试文件中

^{pr2}$

我将如何模拟“函数”中列出的代码?Token可以是字符串形式的任何数字,valid应该是int(1)


Tags: 函数代码inauth概念示例serverlibrary
2条回答

首先,您可以并且应该模仿xmlrpc.client.ServerProxy;您的库将xmlrpc.client作为一个新名称导入,但它仍然是相同的模块对象,因此库中的xmlrpclib.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,然后使用返回值来查找另一个也被调用的属性。在模拟时,您需要寻找相同的链;为此使用^{} attribute。默认情况下,调用mock时会返回一个新的mock实例,但您也可以设置测试值。在

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

为不同的结果创建单独的测试。可能令牌在一种情况下有效,而在另一种情况下无效,您需要测试这两种情况:

^{pr2}$

有许多mock attributes要使用,您可以稍微更改补丁装饰器的用法,如下所示:

class Tester(unittest.TestCase):
    def test_xmlrpclib(self):
        with patch('library.xmlrpclib.ServerProxy.isTokenValid') as isTokenValid:
            self.assertEqual(isTokenValid.call_count, 0)
            # your test code calling xmlrpclib
            self.assertEqual(isTokenValid.call_count, 1)
            token = isTokenValid.call_args[0]  # assume this token is valid
            self.assertEqual(isTokenValid.return_value, 1)

您可以调整上面的代码以满足您的需求。在

相关问题 更多 >