Comment pourrais-je configurer Effort Testing Tool pour simuler le fonctionnement de DbContext avec Entity Framework avec la base de données SQL Server actuelle et opérationnelle

effort entity-framework mocking sql-server unit-testing

Question

Le développement d'applications de notre équipe implique l'utilisation de l'outil de test d'effort pour simuler le DbContext de notre Entity Framework. Cependant, il semble qu'Effort Testing Tool doive voir la base de données SQL Server que l'application utilise pour se moquer du DbContext de Entity Framework, ce qui semble aller à l'encontre des principes de tests unitaires appropriés.

La raison en est que pour tester le code de notre application en moquant tout ce qui concerne la connectivité de la base de données (par exemple, DbContext de Entity Framework), nous ne devrions jamais avoir besoin d'une base de données opérationnelle.

Comment pourrais-je configurer Effort Testing Tool pour simuler le fonctionnement de DbContext avec Entity Framework avec la base de données SQL Server actuelle et opérationnelle

* Mettre à jour:

@ gert-arnold Nous utilisons l'approche Entity Framework Model First pour implémenter le modèle back-end et la base de données.

L'extrait suivant provient du code de test:

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

Le "name = NorthwindModel" fait référence à notre fichier edmx qui contient des informations sur nos tables de base de données et leurs relations correspondantes.

Si je supprime le "name = NorthwindModel" en établissant la connexion comme la ligne de code suivante, j'obtiens une erreur indiquant qu'il attend un argument:

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

Pourriez-vous s'il vous plaît expliquer comment le code susmentionné devrait être réécrit?

Réponse acceptée

Vous n'avez besoin que de cette chaîne de connexion, car Effort doit savoir où se trouve le fichier EDMX.

Le fichier EDMX contient toutes les informations nécessaires à la création d'un magasin de mémoire avec un schéma identique à celui de votre base de données. Vous devez spécifier une chaîne de connexion uniquement parce que je pensais que ce serait pratique si l'utilisateur ne devait pas jouer avec les chemins EDMX.

Si vous vérifiez l'implémentation de la méthode CreateTransient, vous verrez qu'elle utilise simplement la chaîne de connexion pour en extraire les métadonnées.

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi