2016-05-13 43 views
6

Per anni abbiamo utilizzato il seguente codice per configurare i database in una classe base per i nostri test funzionali per il nostro DAL, e questo ha funzionato molto bene per noi.È possibile utilizzare un progetto di database di Visual Studio in un progetto di test dell'unità per configurare un database vuoto per un test funzionale?

/// <summary> 
/// Initializes the test class by creating the integration database. 
/// </summary> 
[TestInitialize] 
public virtual void TestInitialize() 
{ 
    DataContext = new DataContext(ConnectionString); 

    CleanupPreviousTestRunDatabases(); 

    if (DataContext.Database.Exists()) 
    { 
     DataContext.Database.Delete(); 
    } 

    DataContext.Database.Create(); 
    DataContext.Database.ExecuteSqlCommand(String.Format(Strings.CreateLoginCommand, DatabaseUserName, DatabasePassword)); 
    DataContext.Database.ExecuteSqlCommand(String.Format("CREATE USER {0} FOR LOGIN {0}", DatabaseUserName)); 
    DataContext.Database.ExecuteSqlCommand(String.Format("EXEC sp_addrolemember 'db_owner', '{0}'", DatabaseUserName)); 
} 

Tuttavia, utilizzando Entity Framework non si configurazione di tutti i componenti di un database e vorremmo prendere discrepanze tra il nostro modello EF DAL e il database effettivo.

Utilizziamo gli strumenti SSDT/Visual Studio Database Project per tutto il nostro lavoro di database e so che è possibile scrivere test di unità SQL e in quei test di unità SQL, ho visto la possibilità di impostare e creare un database basato sul progetto stesso del database. Questo è quello che mi piacerebbe fare, ma dalle nostre altre librerie di test funzionali.

posso riferimento alle librerie e scrivere parte del codice di configurazione, ma quello che sto cercando è:

a) Come faccio a fornire quale progetto di database da utilizzare per la distribuzione?

b) Come specificare una stringa di connessione nel codice piuttosto che un file app.config, ad esempio l'utilizzo di localdb con un database denominato dinamicamente?

namespace Product.Data.Tests 
{ 
    using Microsoft.Data.Tools.Schema.Sql.UnitTesting; 
    using Microsoft.VisualStudio.TestTools.UnitTesting; 

    [TestClass] 
    public class FunctionalTest 
    { 
     [TestInitialize] 
     public virtual void TestInitialize() 
     { 
      SqlDatabaseTestClass.TestService.DeployDatabaseProject(); 
      SqlDatabaseTestClass.TestService.GenerateData(); 
     } 
    } 
} 

L'app.config in un progetto di test SQL unità non contiene alcun riferimento di nuovo al progetto di database originale utilizzato per crearlo, e decompilazione parte del codice di prova e vedere come funziona, I don' vedere qualsiasi indicazione Suppone che ci sia un solo progetto di database nella soluzione?

risposta

5

Con una certa direzione dai link @Ed Elliott postato, sono stato in grado di rendere questo accada. Sarà necessario aggiungere Microsoft.SqlServer.Dac come riferimento di assembly da C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.dll (Visual Studio 2015). Fa parte degli strumenti SSDT, quindi sono sicuro che il percorso potrebbe essere diverso per le versioni precedenti.

Quindi come sarebbe utilizzato per un test funzionale in un progetto di test unitario.

[TestClass] 
public class CustomerTypeTests : DatabaseTest 
{ 
    private CustomerType customerType; 

    [TestInitialize] 
    public override void TestInitialize() 
    { 
     base.TestInitialize(); 

     customerType = new CustomerType 
         { 
          Name = "Customer Type" 
         }; 
    } 

    [TestMethod] 
    public void AddOrUpdateCustomerType_ThrowExceptionIfNameIsNull() 
    { 
     ExceptionAssert.Throws<ArgumentNullException>(() => DatabaseContext.AddOrUpdateCustomerType(customerType)); 
    } 
} 

Solo una nota per gli altri, si dovrebbe anche impostare il tuo Build Dependencies in modo che il progetto di test di unità dipende dal progetto di database, assicurando è costruito prima e produce il file corretto dacpac.

Ciò che questo risolve per noi, è che ci fornisce un vero database, non uno basato solo sul modello di Entity Framework, che manca di un sacco di costrutti SQL (prevedibili), in particolare vincoli predefiniti, indici e altri importanti elementi di un database. Al nostro livello DAL, questo è essenziale per noi.

5

Penso che il processo che hai sia un po 'complicato (se ho capito bene che potrei non avere!).

Quello che faccio per unit testing in SSDT è quello di:

  • creare la soluzione
  • Distribuire ogni dacpac che ho bisogno di mio esempio dev
  • eseguire i test

To distribuire un progetto ci sono alcuni modi, è possibile:

  • Creare un "Pubblica profilo" per ogni progetto ed eseguire tale
  • Fare clic destro sul progetto e scegli Pubblica
  • utilizzare uno script PowerShell (o di farlo in codice nel tuo inizializzazione di test) per fare una pubblicare del dacpac.

Una volta che è distribuito eseguito i test, facendo un pubblicano di un dacpac (progetto) è piuttosto semplice da codice o uno script, è possibile:

Se si controlla il te pubblicare poi ti dà molto più controllo più quando si deploly utilizza questo sei testare lo stesso sistema di distribuzione che verrà utilizzato in altri ambienti (supponendo che si utilizzi dacpac per la distribuzione).

ndr

+0

Grazie per la guida e i collegamenti ipertestuali. Sono stato in grado di fare questo lavoro. –