繁体   English   中英

模拟xmlrpc.client方法python

[英]mock xmlrpc.client method 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)
        #...

在我的单元测试文件中

import library

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

如何模拟“功能”中列出的代码? 令牌可以是字符串中的任何数字,有效值可以是int(1)

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

接下来,查看对象的使用方式,并查找调用 (..)语法。 您的库使用服务器代理,如下所示:

# 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.return_value属性 默认情况下,调用模拟时会返回一个新的模拟实例,但您也可以设置测试值。

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

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

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')

有许多模拟属性可以使用,您可以如下更改补丁装饰器的用法:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM