2017-09-01 6 views
2

J'ai une fonction de visualisation qui utilise nmap pour scanner les périphériques du réseau.Utilisation de simulation dans le test de l'application django pour remplacer une fonction

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) 

Maintenant, je veux tester cela pour no devices, 1 device connected et 2 or more device connected. Je dois remplacer les données dans tests.py. Je pensais que cela peut être fait en utilisant la fonction fictive. Je peux le remplacer dans tests.py mais lorsque simuler des réponses, il n'est pas remplacé par la fonction de vue.

Comment puis-je tester cette fonction nmap?

Répondre

1

Le patch de singe serait une bonne solution dans votre cas.

ont également un oeil à this question SO à propos de rapiéçage singe

ici est une mise en œuvre possible, bien sûr, vous devez intégrer dans votre cadre de test.

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 

MISE À JOUR

Pour avoir le plus tard portscanner d'origine dans d'autres parties de tests, l'enregistrer dans les essais après l'importation nmap.

import nmap 

OriginalPortScanner = nmap.PortScanner 

Ensuite, vous pourrez sélectionner le portscanner (soit original ou maquette) comme:

views.nmap.PortScanner = OriginalPortScanner 
+0

your_module signifie mon views.py, non? –

+0

probablement oui. C'est le module où votre vue de la maison est définie. en fait, il ressemble à: 'à partir de vos vues d'importation de l'application» – ohannes

+0

Mais comment fonctionne ici la fonction de simulation. il n'y a pas d'importation de faux. Quel sera l'argument de l'objet pour MockPortScanner –