Architettura basata su unità

0

Questa è probabilmente una domanda dannatamente stupida, per la quale mi scuso, ma non riesco a trovare la sintassi di google giusta per trovare una risposta.

Immagina una proprietà, come questa:

private int _type
public int Type
{
    get { return _type; }
    set 
    {
        _type = value;
        //raise an event in your chosen language or tech
        CallAFunction();
    }
}

Ora, immagina che CallAFunction faccia una sorta di sollevamento pesante abbastanza serio nella tua applicazione, interagendo con il database tramite un repository.

Non sembra irragionevole volere un test unitario per questo, per essere assolutamente sicuro che Type sia impostato su qualunque cosa tu abbia inserito e per verificare che così facendo si solleva l'evento previsto.

Tuttavia, l'impostazione della proprietà con un test chiamerà CallAFunction (), il che significa che non stai più testando realmente una "unità" di codice in quanto tale, e forse ancora più importante che un test molto semplice per questa proprietà molto semplice potrebbe richiede una preparazione più elaborata, incluso il beffardo del deposito, che sembra un enorme eccesso.

In alcuni casi è possibile suddividerli separando l'attivazione di CallAFunction tramite l'evento. Ma non è sempre il caso (sto usando WPF, e gli eventi risalgono a XAML non testabile).

Qual è il modo migliore per dividere queste due cose interdipendenti?

    
posta Matt Thrower 08.05.2014 - 10:46
fonte

1 risposta

4

Ci sono due problemi qui mescolati.

  1. "Va bene avere una logica nascosta in un setter?" Questo è chiesto from time a tempo, e non esiste una risposta universale accettata. Dipende se la cosa aggiuntiva che fai è davvero una parte intrinseca di quella proprietà o meno.
  2. "Come posso testare un metodo con una dipendenza esterna costosa?" Qui l'opinione generale è che se il tuo metodo fa roba tramite un collaboratore, dovresti prendere in giro quel collaboratore o usarlo normalmente assicurandoti che ciò non renda il tuo test unitario eccessivamente lento.
risposta data 08.05.2014 - 10:55
fonte

Leggi altre domande sui tag