【问题标题】:Django unit tests mockDjango 单元测试模拟
【发布时间】:2015-01-30 14:43:01
【问题描述】:

我来到了我以前从未在测试中使用过的 mock 库。如果它在线或不在线,我需要来自服务器的响应(服务器实际上并不存在)。首先,我需要检查该服务器 IP,然后使用 TRUE 或 FALSE 的响应检查它的状态。 Server.object 应该来自 models.py 所以我想我需要在这里开始使用模拟库。也许你们中的一些人可以向我解释或向我展示一些从“模拟”服务器获得虚假响应的示例。我已经阅读了 Django testing , mock 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

【问题讨论】:

  • 您的应用程序通常如何连接到服务器?请求模块?如果确实如此,您需要嘲笑它。也许在您的问题中添加一些代码示例,如果不了解实现,很难说需要模拟什么。
  • @GlenSwinfield App 使用 paramiko 连接到服务器。我会在星期一在这里发布一些有用的代码。
  • @GlenSwinfield 有什么解决办法吗?
  • 所以需要强制client.connect(ip, username='root') 引发异常?
  • @GlenSwinfield 我希望 client.connect(ip, username='root') 得到 TRUE 而不是异常,所以我的想法是启动模拟服务器并在线响应 = True

标签: python django unit-testing mocking paramiko


【解决方案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

【讨论】:

  • def test_server(self, paramiko): 中的 paramiko 做了什么?
  • 补丁装饰器将模块中的 paramiko 替换为 MagicMock 实例,并将相同的实例传递给您的测试方法。这实现了两件事:1)这意味着 paramiko 模块被模拟 2)这意味着您可以对 MagicMock 进行断言,以查看 paramiko 在您的方法中是如何使用的,并准备好返回特定的响应。这一切都在我链接到的文档中。
猜你喜欢
  • 2021-11-26
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 2013-02-22
  • 2011-04-11
  • 2020-05-04
相关资源
最近更新 更多