Domanda

Ho alcune classi di repository che hanno lo scopo di parlare con diversi tipi di dati, derivanti da un IRepository interfaccia.

Nelle implementazioni, il codice parla di un'origine dati, sia una directory di file XML o un database o anche solo una cache. È possibile testare in modo affidabile una di queste implementazioni? Non vedo un'implementazione finta funzionante, perché poi sto solo testando il codice simulato e non il codice effettivo.

È stato utile?

Soluzione

No, useresti un simulazione quando scrivevi una classe che usi un IRepository. Per il implementazioni di IRepository, dovresti testare contro l'origine dati appropriata. Per i database, è un po 'un dolore - per un file system, leggermente meno.

Ove possibile, se riesci a esprimere l'implementazione in termini di flussi o lettori, semplificherai la vita: i test per quelle parti dell'implementazione possono andare contro le fonti di dati in memoria o i flussi dalle risorse nell'assemblaggio di test. Ovviamente probabilmente avrai bisogno alcuni Test che vanno a un database reale o al file system, ma si spera meno.

Sia che tu chiami tali test "unità" o meno è una questione di come si definiscono i test unitari; Personalmente non mi interessa troppo i nomi coinvolti, ma io fare Sii cura di avere test. Per i database in particolare, questi possono essere in qualche modo dolorosi (specialmente se si desidera essere in grado di eseguire test in parallelo) - ma possono anche essere incredibilmente preziosi, nella mia esperienza.

Altri suggerimenti

Penso che se stai testando un codice che persiste in realtà o query, probabilmente vorresti effettivamente colpire un database.

Questi sono test di integrazione piuttosto che test unitari.

È possibile impostare un database di test, in cui conosci lo stato dei dati ed eseguire i test contro questo. Probabilmente vuoi anche dire ai test che sono diversi dai test unitari e non devi essere eseguito ad ogni check -in (in nunit puoi decorare la tua classe di test con un attributo che gli dice di non funzionare)

In linea di massima, non lo farai unità Testare qualsiasi codice il cui unico scopo è parlare con un'origine dati. Potresti comunque voler testare automaticamente il repository, ma tale test sarà un test di integrazione per definizione. Probabilmente non vuoi eseguire quei test come parte del tuo "primo passaggio" si accumula come ad es. Impostazione del database e la pulizia dopo che te stesso può richiedere una quantità di tempo non insignificante.

Se il tuo repository ha altre responsabilità (ad es. Implementazione dell'unità di lavoro di lavoro), è possibile che si desidera testando quelle separatamente.

Ad un certo punto dell'implementazione dell'Irepository utilizzerai un'API di terze parti che leggi/scriverà effettivamente da/da database/file/XML. Quello che vuoi fare è deridere quelle API per assicurarti che il tuo codice chiami l'API giusta nell'ordine giusto.

Quindi, se stai leggendo dal database puoi deridere SQLConnection e SQLCommand e assicurarsi di chiamare i metodi giusti su quelle classi. Se stai scrivendo in un flusso, puoi deridere il flusso e assicurarti di lavarlo e smaltirlo (per esempio).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top