2016-05-17 2 views
2

J'ai un test comme suit:Comment utiliser mock_open avec un décorateur Python UnitTest?

import mock 

# other test code, test suite class declaration here 

@mock.patch("other_file.another_method") 
@mock.patch("other_file.open", new=mock.mock_open(read=["First line", "Second line"]) 
def test_file_open_and_read(self, mock_open_method, mock_another_method): 
    self.assertTrue(True) # Various assertions. 

Je reçois l'erreur suivante:

TypeError: test_file_open_and_read() takes exactly 3 arguments (2 given)

Je suis en train de préciser que je veux __builtin__.open de l'autre fichier méthode pour se moquera avec mock.mock_open plutôt que mock.MagicMock qui est le comportement par défaut pour le décorateur patch. Comment puis-je faire ceci?

Répondre

2

Vous avez manqué le paramètre create de open intégré.

@mock.patch("other_file.open", new=mock.mock_open(read=["First line", "Second line"], create=True) 
+0

Ceci n'est pas nécessaire lors du patchage des builtins, les docs disent "Changé dans la version 3.5: Si vous patchez des builtins dans un module, vous n'avez pas besoin de passer create = True, il sera ajouté par défaut." Je reçois toujours la même erreur. – YPCrumble

1

Si utiliser new_callable au lieu de new. C'est,

@mock.patch("other_file.open", new_callable=mock.mock_open) 
def test_file_open_and_read(self, mock_open_method): 
    # assert on the number of times open().write was called. 
    self.assertEqual(mock_open_method().write.call_count, 
        num_write_was_called) 

Notez que nous passons la fonction poignée mock.mock_open-new_callable, pas l'objet résultant. Cela nous permet de faire pour accéder à la fonction write, tout comme l'exemple dans la documentation des spectacles mock_open.