2017-09-01 109 views
2

我有查看功能,它使用nmap來掃描網絡中的設備。使用模擬測試django應用程序來覆蓋功能

views.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 connected2 or more device connected。我需要覆蓋tests.py中的數據。

我在想,它可以使用模擬功能來完成。我可以在tests.py中覆蓋它,但是當模擬響應時它不會在視圖函數中得到覆蓋。

我該如何測試這個nmap函數?

回答

1

猴子修補將是一個很好的解決方案在你的情況。

也看看this約猴子修補

這裏是一個可能的實現,當然你需要把這個整合到您的測試框架,這樣的問題。

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 

UPDATE

要在以後有原來的端口掃描工具在測試其他部分,將其保存在測試進口NMAP後。

import nmap 

OriginalPortScanner = nmap.PortScanner 

然後,您將能夠選擇端口掃描工具(原始的或模擬),如:

views.nmap.PortScanner = OriginalPortScanner 
+0

your_module意味着我的views.py,對不對? –

+0

可能是的。它是您的主頁視圖被定義的模塊。實際上,它看起來像:'from yourapp import views' – ohannes

+0

但是這裏的模擬函數是如何工作的。沒有從模擬進口。 MockPortScanner –