ódigo da Estrutura @Entity Primeiro: Como propagar um banco de dados para teste de unidade

Minha pergunta e código são baseados noCode Exemplos de teste de unidade da estrutura da primeira entidade publicação no blog. Estou usando o SQL Compact 4.0 e, como tal, meus testes de unidade são executados no banco de dados real usando dados reais semelhantes aos descritos na postagem do blog.

Eu quero propagar meu banco de dados de produção com valores padrão em algumas das tabelas, mas ao executar meus testes de unidade, quero adicionar dados adicionais e atualizar alguns dos valores padrã

Criei uma classe Initializer personalizada que semeia o banco de dados com os valores padrão. Para meus testes de unidade, criei outro inicializador personalizado que herda do primeiro que realiza a propagação e / ou modificações específicas do teste:

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

Eu também uso uma classe base para meus testes de unidade que inicializa o banco de dados de teste da seguinte forma:

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

O teste de unidade real é assim:

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

Quando executo o teste, a consulta Linq que busca o SavedDinner falha com a "A instância do ObjectContext foi descartada e não pode mais ser usada para operações que exigem uma conexão". exceção. Não sei por quê.

O que estou fazendo aqui é um padrão aceitável e alguém pode esclarecer por que isso não está funcionando?

Obrigado

questionAnswers(2)

yourAnswerToTheQuestion