繁体   English   中英

在 Django 应用程序的测试中使用模拟来覆盖函数

[英]Using mock in testing of django application to override a function

我有使用 nmap 扫描网络中设备的查看功能。

视图.py

import nmap
def home(request):

   y=nmap.PortScanner()

   data = y.scan(hosts="192.168.1.*", arguments="-sP")
   context[status]=data['status']['addresses']['ipv4']
   return render_template('home.html',context)

现在我想在no devices1 device connected1 device connected 2 or more device connected下测试这个。 我需要覆盖tests.py 中的数据。

我在想它可以使用模拟功能来完成。 我可以在 tests.py 中覆盖它,但是当模拟响应时它不会在视图函数中被覆盖。

我如何测试这个 nmap 函数?

在您的情况下,猴子修补将是一个很好的解决方案。

也看看这个关于猴子补丁的问题

这是一个可能的实现,当然您需要将其集成到您的测试框架中。

import your_module

class MockPortScanner(object):

    # by setting this class member
    # before a test case
    # you can determine how many result
    # should be return from your view
    count = 0

    def scan(self, *args, **kwargs):
        return {
            'status': {
                'addresses': {
                    'ipv4': [i for i in range(self.count)]
                }
            }
        }

def your_test_method():
    MockPortScanner.count = 5

    request = None # create a Mock Request if you need

    # here is the mocking
    your_module.nmap.PortScanner = MockPortScanner

    # call your view as a regular function
    rv = your_module.home(request)

    # check the response

更新

以后要在测试的其他部分使用原始 PortScanner,请在导入 nmap 后将其保存在测试中。

import nmap

OriginalPortScanner = nmap.PortScanner

然后,您将能够选择 PortScanner(原始或模拟),例如:

views.nmap.PortScanner = OriginalPortScanner

暂无
暂无

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

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