2016-01-12 14 views
11

Ho problemi con l'uso di Effort framework (versione 1.1.4) su unit test my DB-layer.Test dell'unità di sforzo Entity framework 6.1.3 DB-first

Ho un DB-layer che utilizza Entity framework 6.1.3 e il modello è stato creato utilizzando l'approccio database-first quindi esiste un file *.edmx che descrive il modello.

Ho creato una classe parziale per esporre un costruttore aggiuntivo utilizzato dai test unitari con sforzo simili:

public partial class Entities 
{ 
    public Entities(DbConnection connection) 
     : base(connection, true) 
    { 
    } 
} 

La semplice unità di test simile a questo:

private Entities CreateContext() 
    { 
     //var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString; 
     //var connection = Effort.EntityConnectionFactory.CreateTransient(connectionString); 
     //return new Entities(connection as DbConnection); 

     var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities"); 
     var context = new Entities(connection); 
     return context; 
    } 

    [TestMethod] 
    public void Testing_Effort_Integration() 
    { 
     using (var context = CreateContext()) 
     { 
      var entity = context.TableEntity.FirstOrDefault(i=> i.Id); 
      Assert.IsNotNull(entity); 
     } 
    } 

Quando eseguire il test di unità viene generata un'eccezione per la linea:

var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities"); 

{"Il provider non ha restituito un'istanza ProviderManifest."} Messaggio InnerException: {"Impossibile determinare la versione di archiviazione; è richiesta una Connessione storage valido o un accenno di versione. "}

Altri messaggi che ho trovato suggerisce di modificare l'attributo ProviderManifestToken nel file *.edmx da '2012' a '2008'. Questo sembra risolvere il problema ma invece dà la mia un'altra eccezione quando si tenta di utilizzare il contesto per la prima volta qui:

var entity = context.TableEntity.FirstOrDefault(i=> i.Id); 

NotSupportedException Impossibile determinare il nome del provider per fornitore fabbrica di tipo 'System.Data.EntityCli ent.EntityProviderFactory'. Assicurarsi che il provider ADO.NET sia installato o registrato nella configurazione dell'applicazione.

Qualcuno sa come risolvere questo problema in modo da poter utilizzare Effort con il framework di entità 6.1.3 approccio DB-first?

Sono riuscito a utilizzare Effort (versione 1.1.4) a DB-layer di test unità creati in EF 4 e EF 5 con approccio DB-first - questo è il motivo per cui penso che la versione EF possa essere di interesse ...

risposta

17

Un mio collega ha trovato la soluzione al mio problema!

A quanto pare stavo usando il pacchetto nuget "Sforzo" invece del pacchetto nuget "Effort.EF6". Dopo la disinstallazione e l'installazione l'altro ho anche dovuto aggiornare il mio app.config con i tag:

<system.data> 
    <DbProviderFactories> 
     <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" /> 
    </DbProviderFactories> 
    </system.data> 

    <entityFramework> 
    <providers> 
     <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices, Effort" /> 
    </providers> 
    </entityFramework> 

E ho incluso anche una chiamata nel setup per mio test di unità per registrare il provider sforzo:

[SetUp] 
    public void Setup() 
    { 
     EffortProviderConfiguration.RegisterProvider(); 
    } 

Questo ha risolto il problema per il mio. Spero che possa fornire un aiuto agli altri!