Django单元测试模拟

时间:2015-01-30 14:43:01

标签: python django unit-testing mocking paramiko

我来到 mock lib,这是我之前从未在测试中使用过的。我需要来自服务器的响应(服务器实际上并不存在),如果它在线或不在线。首先,我需要检查服务器IP,然后检查其状态,响应为TRUE或FALSE。 Server.object 应该来自 models.py ,所以我想我需要在这里开始使用mock lib。也许你们中的一些人可以向我解释或向我展示一些从“模拟服务器”获得虚假回复的例子。我已经阅读了Django测试,模拟lib官方文档,但没有一个给我足够的信息如何模拟假服务器的响应。

代码示例:

def ssh_server(server_list, timeout=200):
    online = False
    response = []
    server_state = []
    timeout_stamp = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
    for obj_id in server_list:
        server = models.Server.objects.get(id=obj_id)
        ip = server.ip
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        while True:
            try:
                client.connect(ip, username='root')
                online = True
            except:
                online = False

1 个答案:

答案 0 :(得分:1)

在你的测试中,你需要修补paramiko。像这样:

import unittest
from mock import patch

from mymodue import ssh_server

class MyTest(unittest.TestCase):

    @patch('mymodule.paramiko')    
    def test_server(self, paramiko):
        ssh_server(server_list, timeout=200)

不会引发任何异常,因此client.connect(ip, username='root')将获得TRUE。

这样做是模仿paramiko模块,它被导入到你的模块中 - 它将是MagicMock的一个实例,只要调用它的方法,它就会返回MagicMock的更多实例。所以,最终client.connect(ip, username='root')将只返回一个MagicMock实例,它永远不会尝试连接任何东西,你的代码根本不会使用paramiko。

根据您正在测试的内容,您可以检查测试方法中的paramiko变量,断言它已按照您的预期方式使用,即已正确调用其方法。 mock.patch文档将帮助您做到这一点:http://www.voidspace.org.uk/python/mock/patch.html