? Debido a las posibles diferencias entre Linq-to-Entities (EF4) y Linq-to-Objects, necesito usar una base de datos real para asegurar que mis clases de consulta recuperen datos de EF correctamente. Sql CE 4 parece ser la herramienta perfecta para esto, sin embargo he tenido algunos contratiempos. Estas pruebas están usando MsTest.¿Cómo puedo usar bases de datos Sql CE 4 para pruebas funcionales
El problema que tengo es si la base de datos no se vuelve a crear (debido a cambios en el modelo), los datos se siguen añadiendo a la base de datos después de cada prueba sin eliminar nada de los datos. Esto puede provocar conflictos en las pruebas, ya que las consultas devuelven más datos de los previstos.
Mi primera idea fue inicializar un TransactionScope
en el método TestInitialize
y deshacerme de la transacción en TestCleanup
. Desafortunadamente, Sql CE4 no admite transacciones.
Mi siguiente idea fue eliminar la base de datos en TestCleanup
a través de una llamada File.Delete()
. Desafortunadamente, esto parece no funcionar después de ejecutar la primera prueba, ya que la primera prueba es TestCleanup
, parece eliminar la base de datos, pero cada prueba después de la primera no parece recrear la base de datos, y por lo tanto da un error que la base de datos archivo no se encuentra
he tratado de cambiar TestInitialize
y TestCleanup
etiquetas a ClassInitialize
y ClassCleanup
para mi clase de pruebas, pero que con errores con un NullReferenceException
debido a la prueba de funcionamiento antes de la ClassInitialize
(o al menos eso parece. ClassInitialize
es en la clase base y quizás por causando eso).
Se me acabaron las formas de usar efectivamente Sql CE4 para probar. Alguien tiene mejores ideas?
Editar: Terminé encontrando una solución. En mi clase base de prueba de unidad de EF, inicio una nueva instancia de mi contexto de datos y luego llamo al
context.Database.Delete()
y
context.Database.Create()
. Las pruebas unitarias corren un poco más lento, pero ahora se prueba unitaria efectiva usando una base de datos real
edición final: Después de algunos correos electrónicos de ida y vuelta con Microsoft, resulta que
TransactionScope
s están ahora autorizados en SQLCE con la última versión de SqlCE. Sin embargo, si está utilizando EF4, existen algunas limitaciones en cuanto a que debe abrir explícitamente la conexión de la base de datos antes de comenzar la transacción. El siguiente código muestra un ejemplo de cómo usar correctamente SQL CE para la unidad/pruebas funcionales:
[TestMethod]
public void My_SqlCeScenario()
{
using (var context = new MySQLCeModelContext()) //ß derived from DbContext
{
ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext;
objctx.Connection.Open(); //ß Open your connection explicitly
using (TransactionScope tx = new TransactionScope())
{
var product = new Product() { Name = "Vegemite" };
context.Products.Add(product);
context.SaveChanges();
}
objctx.Connection.Close(); //ß close it when done!
}
}
Por supuesto, SQL CE admite transacciones ... pero usar TransactionScope es una forma muy incorrecta de hacerlo. Solo hazlo normalmente a través del objeto Connection. – leppie
No estoy seguro de cómo con entidades EF4 sin 'TransactionScope', a menos que quiera decir que no llama a' SaveChanges() ', lo que significa que las pruebas no son válidas. – KallDrexx
¿Puede proporcionar un ejemplo de cómo sembrar los datos con Sql CE? Utilizo EF6 y me gustaría probarlo usando sql ce –