Sto scoprendo che sto usando molti gestori di contesto in Python. Tuttavia, Ho testato una serie di cose che li utilizzano, e spesso mi viene la necessità della seguente:In Python, c'è un buon idioma per usare i gestori di contesto in setup/teardown
class MyTestCase(unittest.TestCase):
def testFirstThing(self):
with GetResource() as resource:
u = UnderTest(resource)
u.doStuff()
self.assertEqual(u.getSomething(), 'a value')
def testSecondThing(self):
with GetResource() as resource:
u = UnderTest(resource)
u.doOtherStuff()
self.assertEqual(u.getSomething(), 'a value')
Quando questo arriva a molte prove, questo è chiaramente sta per diventare noioso, così nello spirito di SPOT/ASCIUTTO (singolo punto di verità/non ripetersi), vorrei refactoring quei bit nei metodi di prova setUp()
e tearDown()
.
Tuttavia, cercando di fare che ha portato a questa bruttezza:
def setUp(self):
self._resource = GetSlot()
self._resource.__enter__()
def tearDown(self):
self._resource.__exit__(None, None, None)
Ci deve essere un modo migliore per fare questo. Idealmente, nel setUp()
/tearDown()
senza bit ripetitivi per ogni metodo di prova (posso vedere come la ripetizione di un decoratore su ciascun metodo potrebbe farlo).
Modifica: Considerare l'oggetto undertest come interno e l'oggetto GetResource
come una terza parte (cosa che non stiamo cambiando).
Ho rinominato GetSlot
in GetResource
qui-questo è più generale del caso specifico, in cui i gestori di contesto sono il modo in cui l'oggetto è destinato a entrare in uno stato bloccato e fuori.
Non capisco il problema con i metodi 'setUp' /' tearDown', mi sembra perfetto. Suppongo che un'alternativa sarebbe quella di creare un decoratore che usi l'istruzione 'with' e applicarlo automaticamente a tutti i metodi, ma sarebbe più un lavoro senza un reale vantaggio. – interjay
Suppongo sia che io veda i metodi "__" come metodi privati e "magici" che non dovrebbero essere chiamati esplicitamente. Tuttavia, dato che questo è in un contesto di test, forse questo sarà sufficiente. –
Il setup e il teardown sono il pulitore dei due. Penso che GetSlot dovrebbe avere l'API corretta da utilizzare senza il gestore di contesto. Il fatto che tu stia cercando di trovare il modo più pulito per farlo dimostra che GetSlot ha bisogno di lavoro. A meno che GetSlot non sia il tuo codice, nel qual caso prendo tutto indietro. –