Come configurare lo strumento di test di sforzo per simulare DbContext di Entity Framework con l'attuale database di SQL Server attivo e funzionante?

effort entity-framework mocking sql-server unit-testing

Domanda

Lo sviluppo delle applicazioni del nostro team prevede l'uso dello strumento di test dello sforzo per deridere il DbContext del nostro Entity Framework. Tuttavia, sembra che lo strumento di test di sforzo debba essere visualizzato nel database di SQL Server effettivamente utilizzato dall'applicazione per simulare il DbContext di Entity Framework, che sembra andare contro i principi di verifica dell'unità.

Il motivo è che al fine di testare il nostro codice applicativo testando qualsiasi cosa relativa alla connettività del Database (ad esempio DbContext di Entity Framework), non dovremmo mai aver bisogno di un Database per essere attivo e funzionante.

Come configurare lo strumento di test di sforzo per simulare DbContext di Entity Framework con l'attuale database di SQL Server attivo e funzionante?

* Aggiornare:

@ gert-arnold Utilizziamo l'approccio Model First di Entity Framework per implementare il modello e il database di back-end.

Il seguente estratto proviene dal codice di prova:

        connection = Effort.EntityConnectionFactory.CreateTransient("name=NorthwindModel");
        jsAudtMppngPrvdr = new BlahBlahAuditMappingProvider();
        fctry = new BlahBlahDataContext(jsAudtMppngPrvdr, connection, false);
        qryCtxt = new BlahBlahDataContext(connection, false);
        audtCtxt = new BlahBlahAuditContext(connection, false);
        mockedReptryCtxt = new BlahBlahDataContext(connection, false);
        _repository = fctry.CreateRepository<Account>(mockedReptryCtxt, null);
        _repositoryAccountRoleMaps = fctry.CreateRepository<AccountRoleMap>(null, _repository);

Il "nome = NorthwindModel" appartiene al nostro file edmx che contiene informazioni sulle nostre tabelle del database e le loro relazioni corrispondenti.

Se rimuovo "name = NorthwindModel" effettuando la connessione come la seguente riga di codice, viene visualizzato un errore che indica che si aspetta un argomento:

        connection = Effort.EntityConnectionFactory.CreateTransient("name=NorthwindModel");
        jsAudtMppngPrvdr = new BlahBlahAuditMappingProvider();
        fctry = new BlahBlahDataContext(jsAudtMppngPrvdr, connection, false);
        qryCtxt = new BlahBlahDataContext(connection, false);
        audtCtxt = new BlahBlahAuditContext(connection, false);
        mockedReptryCtxt = new BlahBlahDataContext(connection, false);
        _repository = fctry.CreateRepository<Account>(mockedReptryCtxt, null);
        _repositoryAccountRoleMaps = fctry.CreateRepository<AccountRoleMap>(null, _repository);

Potresti spiegare come dovrebbe essere riscritto il codice di cui sopra?

Risposta accettata

Hai solo bisogno di quella stringa di connessione perché lo sforzo deve sapere dove si trova il file EDMX.

Il file EDMX contiene tutte le informazioni necessarie per la creazione di un archivio inmemoria con uno schema identico nel database. Devi specificare una stringa di connessione solo perché ho pensato che sarebbe stato conveniente se l'utente non avesse avuto problemi con i percorsi EDMX.

Se controlli l'implementazione del metodo CreateTransient vedrai che usa semplicemente la stringa di connessione per ottenere la parte dei metadati.

public static EntityConnection CreateTransient(string entityConnectionString, IDataLoader dataLoader)
{
    var metadata = GetEffortCompatibleMetadataWorkspace(ref entityConnectionString);
    var connection = DbConnectionFactory.CreateTransient(dataLoader);
    return CreateEntityConnection(metadata, connection);
}

private static MetadataWorkspace GetEffortCompatibleMetadataWorkspace(ref string entityConnectionString)
{
    entityConnectionString = GetFullEntityConnectionString(entityConnectionString);

    var connectionStringBuilder = new EntityConnectionStringBuilder(entityConnectionString);

    return MetadataWorkspaceStore.GetMetadataWorkspace(
        connectionStringBuilder.Metadata,
        metadata => MetadataWorkspaceHelper.Rewrite(
            metadata, 
            EffortProviderConfiguration.ProviderInvariantName, 
            EffortProviderManifestTokens.Version1));
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché