A un certo punto ho dovuto creare una classe "Class1" e quella classe ha bisogno di un metodo "metodo". Quindi ho il seguente:
Class1MethodTest: A total of N tests that check the behavior of Class1.method
Class1 method: A full implementation of the method
Ma un po 'più tardi ho bisogno di una classe diversa "Class2" per avere un metodo "metodo" completamente simile. Ora ho diversi approcci:
Approccio 1
Class1MethodTest: A total of N tests
Class1 method: Full implementation
Class2MethodTest: Another set of identical tests
Class2 method: Another full implementation
Pro: semplice stupido
Contro: non SECCO
Almeno questo è il primo tentativo e potrei anche scrivere questo prima di fare qualsiasi refactoring, giusto?
Metodo 2:
_hidden_private_implementation_function: Full implementation of required method
Class1MethodTest: A total of N tests
Class1 method: Call hidden_private_whatever
Class2MethodTest: Another set of identical tests
Class2 method: Also call hidden_private_stuff
Pro: codice DRY, ancora stupido
Contro: i test non sono ASCIUTTI, "Interfaccia test, non implementazione"
Approccio 3:
MethodTest: A total of N tests
TotallyPublicCommonMethod: Full implementation of required method
Class1MethodTest: Just one test to verify that Class1 method calls the Public one
Class1 method: Call public common method
Class2MethodTest: One more test
Class2 method: Also call common method
Pro: ASCIUTTO, semplice stupido
Contro: .. altro che "Stai testando l'implementazione, non l'interfaccia"?
Approccio 4:
Questo è dove diventa un po 'esotico. Python mi permette di ASCIUGARE direttamente "Approach 3":
_hidden_private_implementation_function: Full implementation of required method
makeTestForClass(cls): return a total of N tests for class cls
Class1MethodTest = makeTestForClass(Class1)
Class1 method: Call hidden_private_whatever
Class2MethodTest = makeTestForClass(Class2)
Class2 method: Also call hidden_private_stuff
Pro: DRY, "Non testare l'implementazione"
Contro: non così semplice. Troppo difficile da modificare se decido di cambiare qualcosa in Class1.method, ma non in Class2.method
Posso pensare ad un paio di altri approcci, ma quelli non sono molto diversi da questi sopra.
In questo momento ho un codice che assomiglia a "Approach 1" e sto pensando a quale dei due dovrei andare per rendere tutto più pulito e migliore.