2017-06-21 2 views
0

Je me moque d'une file d'attente de messages, où je veux qu'elle renvoie 2 messages, puis retourne None chaque fois qu'elle est appelée (pour simuler que la file d'attente est vide). Cependant, après l'appel du 3ème message, j'obtiens une erreur de la part de l'infrastructure qui se moque de dire qu'il n'y a pas de valeur "suivante".Python retourne la valeur par défaut après que les valeurs initiales prédéfinies soient retournées

Voici un exemple:

from mock import MagicMock 

mock_message_queue = MagicMock(name='message_queue') 
expected_messages = ['message 1', 'message 2', None] 
mock_message_queue.fetch.side_effect = expected_messages 

print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch())) 
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch())) 
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch())) 
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch())) 

Sortie:

mock_message_queue.fetch() = message 1 
mock_message_queue.fetch() = message 2 
mock_message_queue.fetch() = None 
Traceback (most recent call last): 
    File "/home/wsi/.PyCharm2017.1/config/scratches/mock_message_bus.py", line 10, in <module> 
    print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch())) 
    File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1062, in __call__ 
    return _mock_self._mock_call(*args, **kwargs) 
    File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1121, in _mock_call 
    result = next(effect) 
StopIteration 

Process finished with exit code 1 

Donc, fondamentalement, je veux qu'il revienne toujours Aucun après il retourne 'un message 2'. Quelqu'un sait-il comment faire ça?

Répondre

2

Le problème est que vous avez besoin du dernier élément de la liste de valeurs pour répéter indéfiniment. Vous pouvez utiliser itertools.repeat pour cela, avec itertools.chain pour le joindre à la liste des valeurs réelles.

expected_messages = itertools.chain(['message 1', 'message 2'], itertools.repeat(None))