Entity Framework Code First: Cómo sembrar una base de datos para pruebas unitarias

Mi pregunta y mi código se basan enCode First Entity Framework Unit Test Ejemplos entrada en el blog. Estoy usando SQL Compact 4.0 y, como tal, mis pruebas unitarias se ejecutan contra la base de datos real utilizando datos reales similares a los que se describen en la publicación del blog.

Quiero sembrar mi base de datos de producción con valores predeterminados en algunas de las tablas, pero cuando ejecuto mis pruebas unitarias quiero agregar datos adicionales y actualizar algunos de los valores predeterminados.

He creado una clase Initializer personalizada que genera la base de datos con los valores predeterminados. Para mis pruebas unitarias, he creado otro Initializer personalizado que hereda del primero que realiza la prueba y / o modificaciones específicas de la prueba:

public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners>
{
    protected override void Seed(NerdDinners context)
    {
        var dinners = new List<Dinner>
                          {
                              new Dinner()
                                  {
                                      Title = "Dinner with the Queen",
                                      Address = "Buckingham Palace",
                                      EventDate = DateTime.Now,
                                      HostedBy = "Liz and Phil",
                                      Country = "England"
                                  }
                          };

        dinners.ForEach(d => context.Dinners.Add(d));

        context.SaveChanges();
    }
}

public class NerdDinnersInitializerForTesting : NerdDinnersInitializer
{
    protected override void Seed(NerdDinners context)
    {
        base.Seed(context);

        var dinner = context.Dinners.Where(d => d.Country == "England").Single();
        dinner.Country = "Ireland";

        context.SaveChanges();
    }
}

También uso una clase base para mis pruebas unitarias que inicializa la base de datos de prueba de la siguiente manera:

[TestClass]
public abstract class TestBase
{
    protected const string DbFile = "test.sdf";
    protected const string Password = "1234567890";
    protected NerdDinners DataContext;

    [TestInitialize]
    public void InitTest()
    {
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0", "",
                string.Format("Data Source=\"{0}\";Password={1}", DbFile, Password));
        Database.SetInitializer(new NerdDinnersInitializerForTesting());

        DataContext = new NerdDinners();
        DataContext.Database.Initialize(true);
    }

    [TestCleanup]
    public void CleanupTest()
    {
        DataContext.Dispose();

        if (File.Exists(DbFile))
        {
            File.Delete(DbFile);
        }
    }
}

La prueba de la unidad real se ve así:

[TestClass]
public class UnitTest1 : TestBase
{
    [TestMethod]
    public void TestMethod1()
    {
        var dinner = new Dinner()
                          {
                              Title = "Dinner with Sam",
                              Address = "Home",
                              EventDate = DateTime.Now,
                              HostedBy = "The wife",
                              Country = "Italy"
                          };

        DataContext.Dinners.Add(dinner);
        DataContext.SaveChanges();

        var savedDinner = (from d in DataContext.Dinners
                           where d.DinnerId == dinner.DinnerId
                           select d).Single();

        Assert.AreEqual(dinner.Address, savedDinner.Address);
    }
}

Cuando ejecuto la prueba, la consulta de Linq que obtiene el salvadoDinner falla con "La instancia de ObjectContext ha sido eliminada y ya no se puede usar para operaciones que requieren una conexión". excepción. No puedo entender por qué.

Es lo que estoy haciendo aquí un patrón aceptable y alguien puede arrojar algo de luz sobre por qué esto no funciona?

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta