Non ripetersi contro fare solo una cosa in un metodo

3

Attualmente sto scrivendo alcuni casi di test in python. Spesso finisco per chiamare le stesse due o tre righe di codice all'inizio di un caso di test per ottenere il programma che sto testando. Ad esempio:

test_something_foo():
    call_method_a(x)
    call_method_b(y)
    # test some stuff

test_something_bar():
    call_method_a(x)
    call_method_b(y)
    # test some other stuff

Questo significa che sto ripetendo più e più volte queste due linee. Così ho pensato di estrarre in questo modo:

test_something_foo():
    call_method_a_and_b(x,y)
    # test some stuff

test_something_bar():
    call_method_a_and_b(x,y)
    # test some other stuff

call_method_a_and_b(x, y):
    call_method_a()
    call_method_b()

Ma non sono sicuro se sia una buona idea. Da un lato risolve il principio "non ripeterti", ma il mio metodo "call_method_a_and_b ()" non viola il principio di "un metodo dovrebbe fare una cosa e una sola cosa". Come concilia questi due principi di progettazione apparentemente in conflitto ??

    
posta user2368795 12.03.2015 - 02:18
fonte

2 risposte

3

Questo è ciò che è setUp . Viene eseguito automaticamente prima di eseguire ogni test e può essere utilizzato per inizializzare i campi e le proprietà delle classi o impostare l'ambiente (in caso di integrazione e test di sistema).

Per quanto riguarda il principio di una cosa, è perfettamente soddisfacente avere un metodo A che chiama i metodi B e C se il metodo A agisce su un diverso livello di astrazione rispetto a B e C.

Quale sarebbe una violazione del principio di una cosa è mettere i corpi del metodo B e C all'interno del metodo A.

Esempio: per creare un prodotto, è necessario:

  1. Archivia il prodotto nel database,

  2. Salva l'immagine del prodotto sul disco.

Queste due azioni possono essere inserite in un metodo createProduct implementato in questo modo:

def createProduct(self):
    self.db.storeProduct(product_model)
    self.moveImage(product_model.image_upload_path)

Il metodo createProduct esegue una cosa: crea un prodotto. D'altra parte, se il metodo andasse effettivamente nei dettagli della manipolazione del database e dell'archiviazione dei file, farebbe più cose.

    
risposta data 12.03.2015 - 02:24
fonte
2

Se riesci a pensare ad un nome migliore di call_method_a_and_b() , un nome che è un singolo concetto, allora non è una violazione del principio "una cosa".

Se stai chiamando a e b in questo ordine per diversi motivi in foo rispetto a bar , quindi potrebbe essere necessario modificare uno dei due siti di chiamata mentre l'altro rimane lo stesso, quindi tu non stanno violando DRY. (Ad esempio, foo potrebbe dover cambiare per chiamare b e poi a , mentre bar deve mantenere l'ordine originale.)

Quindi, valuta se è una coincidenza che stai chiamando a e b in quell'ordine, o se la coppia di essi in quell'ordine rappresenta un'idea o un concetto. Non fare un metodo se è una coincidenza, e fallo se è un'idea. Assicurati solo di non nominare il metodo call_method_a_and_b() .

    
risposta data 12.03.2015 - 06:05
fonte

Leggi altre domande sui tag