0

Ich verwende Unittest und Nose-parametrized, und möchte verschiedene Dekoratoren auf einen Test basierend auf einer Bedingung anwenden.Anwenden von verschiedenen Dekoratoren basierend auf einer Bedingung

Ich habe einen Test und ich möchte unittest.skip den Test überspringen oder @parameterized.expand(args) basierend auf den Argumenten an Argumenten übergeben.

Ich denke, ich brauche einen anderen Dekorateur, der richtige Dekorateur auf den Test anwendet, aber jetzt sicher wie.

Pseudo-Code könnte so etwas wie dieses:

@validate_data(args) 
    def test(args): 
    ... 

wo @validate_data(args) ein Dekorateur ist die unittest.skip gilt, wenn args == None oder @parameterized.expand(args) sonst

Alle Kommentare/Vorschläge geschätzt.

Antwort

2

Ein Dekorator kann auch als Funktion aufgerufen werden. @decorator entspricht decorator(func) und @decorator(args) bis decorator(args)(func). So könnten Sie den Wert dieser Funktionsrückgabe bedingt in Ihrem Decorator zurückgeben. Hier ist ein Beispiel unter:

def parameterized_or_skip(args=None): 
    if args: 
     return parameterized.expand(args) 
    return unittest.skip(reason='No args') 

... 

@parameterized_or_skip(args) 
def my_testcase(self, a, b): 
    pass 
+0

Weil 'parameterized.expand' böse tut' inspect.stack' Magie, die Sie benötigen eine Funktion zurück, die aus der Klasse Definition aufgerufen werden, und nicht in einer anderen Funktion. Ich habe deine Antwort aktualisiert, damit es funktioniert. –

+0

@DavidWolever, ah! Vielen Dank. Ich wusste nicht, was diese Funktion hat :) – ashwinjv