2017-10-12 9 views
0

J'essaie d'obtenir plus de compétences avec pytest (tests unitaires).Comment tester cette classe __init__ méthode déclenche une exception en utilisant fixture dans pytest (Python)

J'essaie de tester si une exception est levée lorsqu'une classe est instanciée sans paramètre obligatoire. J'ai essayé de créer un appareil pour cela, mais cela entraîne un problème: lorsque le projecteur est appelé, il essaie de créer la classe à l'intérieur avec le paramètre manquant et déclenche mon exception avant que pytest n'atteste que l'exception a été levée. J'ai réussi à surmonter cela en n'utilisant pas de luminaire et en instanciant simplement la classe à l'intérieur de la fonction de test, mais je me demande s'il existe une façon plus élégante d'utiliser un appareil pour cela.

classe Exemple:

class MyClass(object): 

    def __init__(self, must_have_parameter=None): 

    if not must_have_parameter: 

     raise ValueError("must_have_parameter must be set.") 

Lorsque vous essayez d'utiliser cet appareil dans un test que je reçois naturellement une erreur.

@pytest.fixture() 
def bad_class_instantiation(): 

    _bad_instance = MyClass() 

    return _bad_instance 

Ensuite, il y a un test:

def test_bad_instantiation(bad_class_instantiation): 

    with pytest.raises(ValueError, message="must_have_parameter must be set."): 

     bad_class_instantiation() 

Ce test échoue que la classe s'instancié avant que le scénario de test (C'est mon interprétation)? Il montre encore qu'un ValueError et le message est produit personnalisé s'affiche ..

Si je change le cas de test:

def test_bad_instantiation(): 

    with pytest.raises(ValueError, message="must_have_parameter must be set."): 

     bad_instance = MyClass() 

Ensuite, le test passe.

Existe-t-il un moyen d'utiliser un appareil pour cela ou je devrais simplement appeler la classe dans la fonction de test et l'appeler un jour?

Merci pour votre temps.

Tomasz

+1

Je voudrais juste souligner qu'un paramètre "must-have" devrait probablement être un argument positionnel, pas un argument mot-clé. Les Kwargs sont presque toujours optionnels (et configurés sur des valeurs par défaut raisonnables/saines). – bnaecker

+2

Dans ce cas de test que la classe ne peut pas être instanciée sans le 'must_have_parameter', je ne pense pas que vous ayez besoin d'utiliser un fixture. Votre dernier exemple _'avec pytest.raises (ValueError, message = "must_have_parameter doit être défini."): Bad_instance = MyClass() '_ est la bonne façon de le faire. – aneroid

Répondre

1

Je ne vois aucun avantage à la fixation dans cette situation. Je voudrais simplement créer l'objet dans la méthode de test. Avoir un paramètre optionnel avec une valeur par défaut et puis lever une exception quand le paramètre est manquant semble très étrange. À moins que vous ayez vraiment besoin d'un message d'erreur personnalisé, pensez à supprimer la valeur par défaut.