Wie würde ich das Effort Testing Tool konfigurieren, um den DbContext von Entity Framework vorzuspielen, ohne dass die eigentliche SQL Server-Datenbank ausgeführt wird?


Frage

Die Anwendungsentwicklung unseres Teams beinhaltet die Verwendung von Effort Testing Tool, um den DbContext unseres Entity Framework nachzuahmen. Es scheint jedoch, dass das Effort Testing Tool die tatsächliche SQL Server-Datenbank sehen muss, die die Anwendung verwendet, um den DbContext unseres Entity Framework zu verspotten, der gegen die Prinzipien des Unit Testing zu laufen scheint.

Der Grund dafür ist, dass wir, um unseren Anwendungscode testen zu können, indem wir etwas über die Datenbankverbindung mokieren (zum Beispiel den DbContext von Entity Framework), sollten wir niemals eine Datenbank brauchen, um betriebsbereit zu sein.

Wie würde ich das Effort Testing Tool konfigurieren, um den DbContext von Entity Framework vorzuspielen, ohne dass die eigentliche SQL Server-Datenbank ausgeführt wird?

* Aktualisierung:

@ gert-arnold Wir verwenden Entity Framework Model First, um das Backend-Modell und die Datenbank zu implementieren.

Der folgende Auszug stammt aus dem Testcode:

        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);

Der "Name = NorthwindModel" bezieht sich auf unsere edmx-Datei, die Informationen über unsere Datenbanktabellen und ihre entsprechenden Beziehungen enthält.

Wenn ich den "name = NorthwindModel" entferne, indem ich die Verbindung wie die folgende Codezeile mache, erhalte ich eine Fehlermeldung, dass ein Argument erwartet wird:

        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);

Könnten Sie bitte erklären, wie der oben genannte Code umgeschrieben werden sollte?

Akzeptierte Antwort

Sie benötigen nur diese Verbindungszeichenfolge, da Effort wissen muss, wo sich die EDMX-Datei befindet.

Die EDMX-Datei enthält alle Informationen, die zum Erstellen eines Speicherspeichers mit einem identischen Schema in Ihrer Datenbank erforderlich sind. Sie müssen nur eine Verbindungszeichenfolge angeben, weil ich dachte, dass es praktisch wäre, wenn der Benutzer sich nicht mit EDMX-Pfaden anlegen müsste.

Wenn Sie die Implementierung der CreateTransient-Methode überprüfen, werden Sie feststellen, dass sie nur die Verbindungszeichenfolge verwendet, um den Metadaten-Teil davon zu erhalten.

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));
}




Lizenziert unter: CC-BY-SA
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum