Se moquant open(nom_fichier) dans les tests unitaires
J'ai un code source qui ouvre un fichier csv et met en place un en-tête de
la valeur de l'association. Le code source est donné ci-dessous:
def ParseCsvFile(source):
"""Parse the csv file.
Args:
source: file to be parsed
Returns: the list of dictionary entities; each dictionary contains
attribute to value mapping or its equivalent.
"""
global rack_file
rack_type_file = None
try:
rack_file = source
rack_type_file = open(rack_file) # Need to mock this line.
headers = rack_type_file.readline().split(',')
length = len(headers)
reader = csv.reader(rack_type_file, delimiter=',')
attributes_list=[] # list of dictionaries.
for line in reader:
# More process to happeng. Converting the rack name to sequence.
attributes_list.append(dict((headers[i],
line[i]) for i in range(length)))
return attributes_list
except IOError, (errno, strerror):
logging.error("I/O error(%s): %s" % (errno, strerror))
except IndexError, (errno, strerror):
logging.error('Index Error(%s), %s' %(errno, strerror))
finally:
rack_type_file.close()
Je suis en train d'essayer de se moquer de l'instruction suivante
rack_type_file = open(rack_file)
Comment se moquer ouvert(...) la fonction?
- J'ai peur à l'aide de Maquette de la bibliothèque est un non commencé. Nous sommes seulement autorisés à utiliser le mox.
- J'ai écrit un exemple qui utilise mox pour vous.
Vous devez vous connecter pour publier un commentaire.
Ce n'est certes une vieille question, d'où certaines réponses sont obsolètes.
Dans la version actuelle de la
mock
bibliothèque il n'y est une fonction de commodité conçu précisément pour cette fin. Voici comment cela fonctionne:Documentation est ici.
from unittest.mock import mock_open
.Pour se moquer de fonction intégrée ouverte avec mox utilisation
__builtin__
module:Noter que
__builtins__
n'est pas toujours un module, il peut être de type dict, veuillez utiliser__builtin__
(sans "s") module à se référer à système intégré dans les méthodes.Plus sur
__builtin__
module: http://docs.python.org/library/intégré.htmlIl y a deux façons que j'aime pour ce faire, en fonction de la situation.
Si votre unité de test va appeler ParseCsvFile directement, je voudrais ajouter un nouveau kwarg à ParseCsvFile:
Alors votre de test de l'unité peut passer à un autre open_func dans le but de réaliser les moqueries.
Si votre test unitaire appelle une autre fonction qui à son tour appelle ParseCsvFile de le passer autour de open_func juste pour les tests, c'est moche. Dans ce cas, je voudrais utiliser le maquette du module. Cela vous permet de modifier une fonction par son nom et de le remplacer par un objet Fantaisie.
open
remplacementopen_func
. Vous pouvez simplement utiliseropen=open
dans votre signature de fonction et pas besoin de faire tout (potentiellement obscurcir) de modifier le code.Est simple avec le décorateur (Python3):
J'ai pris la liberté de ré-écrire votre exemple de fonction:
Assumer votre fonction se trouve dans un fichier nommé
code.py
Un test simple, ce serait le cas:
EDIT:
Fonctionne très bien sur les 2.6 utilisation de combustible mox 0.53
Salut j'ai un problème similaire, et déchirait mes cheveux retournement entre les différents moqueur bibliothèques. J'ai finalement trouvé une solution que je suis heureux avec, et peut-être cela peut vous aider? En fin de compte, je suis allé avec le Moqueur bibliothèque http://labix.org/mocker et voici le code pour s'être moqué d'ouverture:
Incidentaly la raison pour laquelle je suis allé avec Moqueur est parce que j'ai été le tester une fonction qui a été utilisée ouvrir pour lire un fichier, et ensuite utilisé ouvrir de nouveau pour remplacer le même fichier avec les nouvelles données. Ce que je devais être capable de faire est de tester le cas où le fichier n'existe pas, donc mis en place une maquette, qui a jeté un IOError la première fois, et a ensuite travaillé pour la deuxième fois. Le programme d'installation pour qui ressemblait à ceci:
Espérons que cette aide!
@mock.patch décorateur (2.7 exemple)
C'est maintenant beaucoup plus facile: