2016-08-18 3 views
0

J'ai ce morceau de code:appel Affirmant avec lambda

from shutil import rmtree 

def ook(path): 
    rmtree(path, onerror=lambda x, y, z: self._logger.warn(z[1])) 

Dans mes tests unitaires, je veux moquer vérifier si ce droit path est passé:

from mock import patch, ANY 

@patch("rmtree") 
def test_rmtree(self, m_rmtree): 
    ook('/tmp/fubar') 
    m_rmtree.assert_called_once_with('/tmp/fubar', onerror=ANY) 

Que puis-je remplacer ANY avec pour vérifier qu'il y a un lambda là-bas?

+0

Je pense qu'il est probablement plus facile d'affirmer qu'il a été appelé du tout, puis d'obtenir les arguments du faux et de les affirmer individuellement. AFAIK 'unittest.mock' n'a rien comme [' jasmine.any'] (http://jasmine.github.io/2.0/introduction.html#section-Matching_Anything_with_ jasmine.any), par exemple. – jonrsharpe

Répondre

1

Je ferais cela avec la call_args et call_count plutôt que directement dans assert_called_once_with, je ne pense pas que unittest.mock a quelque chose comme par exemple jasmine.any:

from collections import Callable 

... 

@patch("rmtree") 
def test_rmtree(self, m_rmtree): 
    ook('/tmp/fubar') 
    assert m_rmtree.call_count == 1 
    args, kwargs = m_rmtree.call_args 
    assert args[0] == '/tmp/fubar' 
    assert isinstance(kwargs.get('onerror'), Callable) 

Notez que ce n'est pas pertinent que l'argument est un lambda spécifiquement, juste qu'il est appelable.

+0

@Sardathrion en êtes vous sûr? Quand je l'ai testé, j'ai trois valeurs: https://repl.it/Co6v/0. Le [code source] (https://hg.python.org/cpython/file/3.5/Lib/unittest/mock.py#l1925) se réfère à la fois, de manière confuse ... – jonrsharpe

+0

Comment étrange! Je l'ai testé avec Python 2.7 si cela fait une différence. Docs (pour Py3) dit: Ceci est soit Aucun (si le simulacre n'a pas été appelé), soit les arguments avec lesquels le simulacre a été appelé pour la dernière fois. Ce sera sous la forme d'un tuple: le premier membre est n'importe quel argument ordonné avec lequel le simulacre a été appelé (ou un tuple vide) et le second membre est un argument mot-clé (ou un dictionnaire vide). Ce qui semble indiquer, c'est un tuple de deux ... – Sardathrion