2017-06-17 2 views
1

Je veux tester cette méthode:Comment puis-je tester que j'appelle pickle.dump() correctement?

class Data(object): 

    def save(self, filename=''): 
     if filename: 
      self.filename = filename 
     if not self.filename: 
      raise ValueError('Please provide a path to save to') 
     with open(self.filename, 'w') as f: 
      pickle.dump(self, f) 

je peux mettre en place le test pour vous assurer que pickle.dump est appelé, et que le premier argument est l'objet:

@patch('pickle.dump') 
def test_pickle_called(self, dump): 
    self.data.save('foo.pkl') 
    self.assertTrue(dump.called) 
    self.assertEquals(self.data, dump.call_args[0][0]) 

Je ne suis pas sûr que faire pour le deuxième argument, cependant. Si j'ouvre un nouveau fichier pour le test, ça ne va pas être le même que ce qui est appelé pour l'exécution. J'aimerais au moins m'assurer que j'ouvre le bon dossier. Est-ce que je me moquerais open et m'assurerais qu'on m'appelle avec le bon nom à un moment donné?

+0

Je pensais en fait ce ne valait pas le test, et je l'ai fait autant que je pouvais quand même et a trouvé deux bugs .... – JETM

Répondre

2

Corrigez open() et renvoyez une instance de StringIO accessible en écriture. Chargez des données décapées à partir de StringIO et testez sa structure et ses valeurs (vérifiez qu'il est équivalent à self.data). Quelque chose comme ceci:

import builtins # or __builtin__ for Python 2 
builtins.open = open = Mock() 
open.return_value = sio = StringIO() 
self.data.save('foo.pkl') 
new_data = pickle.load(sio.getvalue()) 
self.assertEqual(self.data, new_data) 
+0

Comment puis-je obtenir le 'StringIO' que le patché 'open' renvoie après que j'appelle' data.save() '? Ou est-ce que je ne comprends pas où je ferais ça? – JETM

+1

J'ai étendu la réponse. Ce n'est qu'un exemple, pas encore une solution complète. – phd