Domanda

In che modo le persone eseguono test unitari sul codice che utilizza Linq to SQL?

È stato utile?

Soluzione

Aggiornamento:

Fredrik ha messo una soluzione di esempio su come eseguire unit test delle applicazioni linq2sql sul suo blog.Puoi scaricarlo su:

http://web.archive.org/web/20120415022448/http://iridescenza.no/post/DataContext-Repository-Pattern-Example-Code.aspx

Non solo penso che sia fantastico che abbia pubblicato una soluzione di esempio, ma è anche riuscito a estrarre le interfacce per tutte le classi, il che rende il design più disaccoppiato.

Il mio vecchio post:

*Ho trovato questi blog che ritengo siano un buon inizio per creare il wrapper DataContext:Collegamento1 Collegamento2

Coprono quasi lo stesso argomento, tranne per il fatto che il primo implementa mezzi per estrarre anche le interfacce per le tabelle.Il secondo però è più esteso, quindi l'ho incluso anch'esso.*

Altri suggerimenti

3 anni di ritardo, ma ecco come lo faccio:

https://github.com/lukesampson/LinqToSQL-test-extensions/

Non c'è bisogno di scrivere un wrapper o fare molti lavori idraulici, basta rilasciare il modello T4 accanto al tuo .dbml e otterrai:

  1. Un'interfaccia per il contesto dei dati, ad es.IExampleDataContext
  2. Un mock in memoria per il contesto dei dati, ad es.MemoryExampleDataContext

Entrambi utilizzeranno automaticamente le mappature che hai già configurato nel tuo DBML.

Quindi puoi fare cose del tipo

public class ProductRepo {
    IExampleDataContext DB { get; set };
    public ProductRepo(IExampleDataContext db) {
        DB = db;
    }

    public List<Product> GetProducts() {
        return DB.Products.ToList();
    }
}

e puoi chiamarlo con entrambi

new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing

O

new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB

Avvolgi DataContext, quindi simula il wrapper.È il modo più veloce per farlo, anche se richiede la codifica per i test, cosa che alcune persone pensano puzzi.Ma a volte, quando hai dipendenze che non possono essere (facilmente) derise, è l'unico modo.

Linq rende i test molto più semplici.Le query Linq funzionano altrettanto bene sugli elenchi che sul materiale Linq-to-sql.Puoi sostituire Linq con SQL con oggetti elenco e testare in questo modo.

Mattwar alle Il registro web ribelle aveva un ottimo articolo su come simulare un contesto dati Linq2Sql estensibile.Controlla -- MOCKS NIX - UN LINQ ESTENSIBILE A SQL DATACONTEXT

Normalmente, non è necessario testare la parte del codice che utilizza LINQ to SQL, ma se lo desideri davvero, puoi utilizzare gli stessi set di dati che stai interrogando sul server e trasformarli in oggetti in memoria e eseguire le query LINQ contro questo (che utilizzerebbe i metodi Enumerable anziché Queryable).

Un'altra opzione è utilizzare quella di Matt Warren versione mockable di DataContext.

È inoltre possibile ottenere le istruzioni SQL utilizzate da LINQ to SQL ottenendole tramite il debugger (dall'oggetto IQueryable), controllandole manualmente e quindi includendole nei test automatizzati.

LINQ to SQL è in realtà davvero utile per i test unitari in quanto ha la capacità di creare database al volo da ciò che è definito nel tuo DBML.

È davvero bello testare un livello ORM creando il DB tramite DataContext e avendolo vuoto all'inizio.

Ne parlo sul mio blog qui: http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql.aspx

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