¿Cómo configuraría la herramienta de prueba de esfuerzo para simular DbContext de Entity Framework sin la base de datos real de SQL Server en funcionamiento?


Pregunta

El desarrollo de la aplicación de nuestro equipo implica el uso de la herramienta de prueba de esfuerzo para burlarse de DbContext de Entity Framework. Sin embargo, parece que la Herramienta de prueba de esfuerzo debe verse en la base de datos de SQL Server real que utiliza la aplicación para burlarse de DbContext de Entity Framework, que parece ir en contra de los principios de prueba de unidad adecuados.

La razón es que para probar de forma unitaria nuestro código de aplicación simulando cualquier cosa relacionada con la conectividad de la base de datos (por ejemplo, DbContext de Entity Framework), nunca deberíamos necesitar una base de datos para estar en funcionamiento.

¿Cómo configuraría la herramienta de prueba de esfuerzo para simular DbContext de Entity Framework sin la base de datos real de SQL Server en funcionamiento?

* Actualización:

@ gert-arnold Estamos utilizando el modelo Entity Framework Model First para implementar el modelo de back-end y la base de datos.

El siguiente extracto es del código de prueba:

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

El "nombre = NorthwindModel" pertenece a nuestro archivo edmx que contiene información sobre nuestras tablas de base de datos y sus relaciones correspondientes.

Si elimino el "nombre = NorthwindModel" haciendo la conexión como la siguiente línea de código, recibo un error que indica que espera un argumento:

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

¿Podría explicar cómo debería reescribirse el código antes mencionado?

Respuesta aceptada

Solo necesita esa cadena de conexión porque Effort necesita saber dónde está el archivo EDMX.

El archivo EDMX contiene toda la información requerida para crear un almacén de memoria con un esquema idéntico que tiene en su base de datos. Debe especificar una cadena de conexión solo porque pensé que sería conveniente si el usuario no tuviera que meterse con las rutas EDMX.

Si verifica la implementación del método CreateTransient verá que simplemente usa la cadena de conexión para obtener la parte de metadatos de la misma.

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




Licencia bajo: CC-BY-SA
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué