2009-06-07 3 views
5

Ho molti oggetti con metodi che richiedono l'accesso al database. Stiamo cercando di entrare nei test unitari ma siamo desiderosi di evitare l'uso di oggetti finti se possibile. Mi chiedo se ci sia un modo per refactoring il metodo Validate mostrato di seguito in modo che non avrebbe bisogno di accesso db. Nell'applicazione attuale di solito c'è un bel po 'di più, ma penso che questo esempio semplificato dovrebbe essere sufficiente.Evita la dipendenza dal database per il test dell'unità senza simulazione

Impareremo a utilizzare gli oggetti mock se ne abbiamo bisogno ma sembra solo un sacco di spese generali, quindi sto cercando alternative.

public class Person 
    { 
     public string Name; 

     public string Validate() 
     { 
      if (PersonDA.NameExists(Name)) 
      { 
       return "Name Already Used"; 
      } 

     } 
    } 
+2

Assicurati di conoscere la differenza tra "unit test" e "test di integrazione" e quando utilizzarli e per cosa sono più adatti. –

+0

A volte uso il seguente schema che non richiede un framework di simulazione http://www.unit-testing.net/CurrentArticle/How-To-Remove-Data-Dependencies-In-Unit-Tests.html – T123

risposta

7

Personalmente mi piacerebbe solo andare il percorso dell'oggetto finto. È molto più flessibile e sembra che tu voglia seguire la strada per inserire il codice di prova nel tuo oggetto reale?

Regarless, estrae il codice di convalida in un oggetto PersonValidator con un metodo per boolean isValid (Person). Quindi nel codice di test utilizzare un simulatore di validazione che restituisce true o false in base al caso di test.

+0

non vuole inserire il codice di prova nell'oggetto. Mi chiedevo solo se ci fosse un modo di refactoring che non avevo pensato che avrebbe rimosso la necessità di oggetti finti. – tjjjohnson

0

Si dovrebbe semplicemente impostare un database che viene utilizzato per il test dell'unità. Se si usano i prototipi per l'accesso ai dati, non si testerebbe molto? :)

+0

forse ho semplificato l'esempio. Spesso vengono eseguiti ulteriori controlli che fanno qualcosa di diverso dal semplice chiamare un metodo di accesso ai dati. – tjjjohnson

+0

Non sono d'accordo - mentre un test-db è uno strumento prezioso da avere nel tuo framework di test, dovresti sforzarti attivamente a minimizzarlo, tranne dove assolutamente necessario. Qualcosa come la convalida di un nome non è stato visto prima non ha alcun bisogno intrinseco di colpire un database - questo è un dettaglio di implementazione - e come tale dovrebbe essere testato senza tale dipendenza se possibile. – dimo414

2

Dai uno sguardo allo dbunit, è impostato appositamente per popolare un piccolo database di test in modo da poter utilizzare i tuoi oggetti reali su un database fittizio durante il test dell'unità. Testare con esso è molto più semplice dello sviluppo di oggetti mock, molto più sicuro della modifica del codice di accesso ai dati e molto più approfondito di entrambi.

+0

Permette anche di essere sicuri che il codice reale funzioni, non solo attraverso oggetti di simulazione (più semplici). –

5

La classe Person è difficile da testare in quanto ha una dipendenza statica nascosta dal codice di accesso al database. Puoi rompere questo accoppiamento introducendo una collaborazione dinamica tra la Persona e qualche nuovo tipo di oggetto che le fornisce le informazioni necessarie per convalidarne lo stato. Nei test di unità della persona è possibile verificare ciò che accade quando è valido o non valido senza colpire il database passando le implementazioni dell'oggetto "stub" del suo collaboratore.

È possibile testare l'implementazione reale, che colpisce il database, in un set separato di test. Questi test saranno più lenti ma dovrebbero essercene meno perché saranno traduzioni dirette dei metodi accessor alle query di database senza una propria logica complessa.

Se lo si desidera, è possibile chiamarlo "utilizzando oggetti fittizi", poiché il design corrente indica solo la necessità di interrompere query, non di prevedere comandi, un framework di oggetti fittizi è uno strumento troppo complicato per il lavoro. Gli stub scritti a mano renderanno i test più facili da diagnosticare.

+0

+1 - Il test delle unità riguarda esclusivamente le dipendenze e la loro gestione. – duffymo

0

Perché stai cercando di evitare esattamente i salti? Se hai intenzione di esercitarti con i test delle unità e hai un codice di accesso ai dati, sarà più facile mettersi a proprio agio con il modo di fare finta/falsificare/iniettare dati.

Se è perché non si desidera introdurre un framework di simulazione, è possibile codificare alcuni semplici stub in base alle proprie esigenze.

Inserire il codice di accesso ai dati dietro un'interfaccia consentirà di evitare la necessità di un database. Prendi in considerazione l'utilizzo di dependency injection per inserire il codice di accesso ai dati di simulazione o stub durante i test.

+0

per lo più solo cercando di scoprire se ci sono alternative alla beffa per questa situazione. – tjjjohnson

Problemi correlati