2015-07-14 1 views
0

J'essaye d'utiliser la bibliothèque de simulation de Python pour simuler quelques méthodes pour le module zipfile.Mocking zipfile en python

Exemple Source que je veux tester:

def zipStuff(listOfPathToFiles): 
    with ZipFile(fName, 'w') as archive: 
     for each in listOfPathToFiles: 
      archive.write(each, strippedfName) 
    return archive 

Le « archive » ci-dessus seront ignorés pour l'exécution normale, mais sera la liste des fichiers lors des tests.

Exemple Code unittest:

emptyList=[] 

def mockWrite(fName): 
    emptyList.append(fName) 
    return 

mockZip.__enter__ = Mock(return_value=emptyList) 
mockZip.__exit__ = Mock(return_value=True) 

Maintenant, je veux moquer archive.write de sorte qu'au lieu de l'appel d'écriture proprement dite, elle est remplacée par la fonction mockWrite je peux obtenir une liste de tous les fichiers qui étaient censés être zippé.

J'ai essayé:

mockZip.write = Mock(side_effect=mockWrite) 

mais cela n'a pas été appelée. Le débogage montre que la fonction appelle mockZip. entrez() .write. Si j'essaie:

mockZip.__enter__().write = Mock(side_effect=mockWrite) 

Python émet une erreur que 'list' n'a pas d'attribut write (ce qui est correct). Je suis nouveau à Mock et Python et apprécierais vraiment des pointeurs. Suggestions?

+0

'mockZip .__ enter__ = (return_value = emptyList)' syntaxe invalide – LittleQ

+0

J'ai écrit le code ici, et encore manqué les appels Faux. La syntaxe correcte est Mock (return_value = emptyList). Modifié la question originale. Merci :) – user2148703

Répondre

2

Au lieu d'avoir mockZip.__enter__ retourner une liste vide, faites revenir un objet comme ce qui suit:

class MockZipFile: 
    def __init__(self): 
     self.files = [] 
    def __iter__(self): 
     return iter(self.files) 
    def write(self, fname): 
     self.files.append(fname) 

Vous pouvez ajouter des méthodes et mises en œuvre au besoin pour répondre à vos besoins moqueurs.

+0

Merci! J'utilise ça maintenant! – user2148703

0

Je crois que votre question est que la fonction est appelée entrer en utilisant contextlib (https://docs.python.org/2/library/contextlib.html) et non entrée. Changer cette maquette devrait résoudre votre problème.

+0

Désolé, je voulais écrire __enter__ et non __entry__. J'ai modifié le post pour refléter cela. – user2148703