2010-04-24 12 views
7

Si può fare senza usare TypeMock Islolator? Ho trovato alcuni suggerimenti online come passare una stringa di connessione solo per i metadati, tuttavia nulla di cui mi sono imbattuto, oltre a TypeMock, sembra davvero consentire un finto ObjectContext che può essere iniettato nei servizi per il test delle unità. Abbasso i $$ per TypeMock o ci sono alternative? Nessuno è riuscito a creare qualcosa di simile a TypeMock che sia open source?EF4 - possibile simulare ObjectContext per il test dell'unità?

+1

Un suggerimento che ho visto è quello di infrangere le regole che si stanno verificando contro il db. Il tizio ha detto che usa CreateDatabase() per creare al volo un'istanza db "fittizia" al volo. In generale, voglio evitare questo dato che abbiamo infranto questa regola su un progetto precedente e non ha funzionato molto bene. Era ok fino a circa 600 test, ma alla fine con> 2000 test era totalmente inutile per il vero TDD e abbiamo eseguito i test in "modalità batch" di tanto in tanto (impiegavano 5 minuti o più per eseguirli). –

risposta

4

Sto testando facilmente l'EF4 senza fare il mocking. Quello che ho fatto è stato creare un'interfaccia repository usando il codice da http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/ come base Ho quindi creato una classe InMemoryRepository<T> che utilizzava l'interfaccia IRepository. Ho quindi sostituito lo IObjectSet<T> con uno List<T> all'interno della classe e modificato di conseguenza i metodi di recupero.

Pertanto, se è necessario eseguire il test dell'unità, immettere InMemoryRepository anziché DataRepository.

+1

-1 Linq2Objects si comporta diversamente con Linq2Entities. I test potrebbero passare contro un elenco ma fallire quando analizzati in SQL da EF. –

+0

Non c'è modo di superarlo senza accedere al database, quindi non sono sicuro di quale sia il tuo punto. Mocking non significa che le tue Linq2Entities saranno sempre valide e funzioneranno correttamente. – KallDrexx

+2

Incapsula le tue query e provale su un vero database. Poi prendili in giro quando collaudi la tua logica di business. Pertanto ogni query è una componente riutilizzabile che sai per un fatto funzionerà. E la tua logica aziendale viene testata senza richiedere un database che si trovi nello stato previsto. –

1

Avvolgere ObjectContext in una classe proxy. Quindi iniettalo nelle tue classi.

+0

Sì, l'ho provato ed è una possibilità, tuttavia tutti questi approcci che utilizzano i proxy hanno i loro limiti. Linq funziona in modo diverso per una cosa (da Linq agli oggetti, da Linq alle entità). –

+2

TRUE, ma aspettarsi che i test delle unità per rilevare le differenze nelle diverse implementazioni Linq sembra un po 'esagerato per i test delle unità. Che altro nell'arena dei test di integrazione non credi? – SamuelWarren

3

Metti la query Linq2Entity dietro un'interfaccia, l'unità lo prova in isolamento su un vero database.

Scrivi test per la tua logica aziendale con i mock per le tue interfacce di query. Non lasciare che Linq insanguini la tua logica aziendale!

Non utilizzare il RepositoryPattern!

0

Non credo che il modello repository è l'unica risposta alla domanda (si evita il problema, certo)

mi è piaciuto risposta - credo più appropriato per l'introduzione di test per una base di codice esistente Creating Interface for ObjectContext

Problemi correlati