Как я могу использовать базы данных Sql CE 4 для функциональных тестов

Из-за потенциальных различий между Linq-to-Entities (EF4) и Linq-to-Objects, мне нужно использовать реальную базу данных, чтобы убедиться, что мои классы запросов правильно извлекают данные из EF . Sql CE 4 кажется идеальным инструментом для этого, однако я столкнулся с некоторыми ошибками. В этих тестах используется MsTest.

У меня проблема в том, что база данных не t воссозданы (из-за изменений модели), данные продолжают добавляться в базу данных после каждого теста, и ничто не избавляет от данных. Это потенциально может вызвать конфликты в тестах, когда запросы возвращают больше данных, чем предполагалось.

Моя первая идея заключалась в инициализации TransactionScope в методе TestInitialize и удалении транзакции в TestCleanup . К сожалению, Sql CE4 не поддерживает транзакции.

Моей следующей идеей было удалить базу данных в TestCleanup с помощью вызова File.Delete () . К сожалению, похоже, что это не работает после запуска первого теста, поскольку первый тест TestCleanup , похоже, удаляет базу данных, но каждый тест после первого, похоже, не воссоздает базу данных, и поэтому возникает ошибка, что файл базы данных не найден.

Я попытался изменить теги TestInitialize и TestCleanup на ClassInitialize и ClassCleanup для моего тестового класса, но в нем была ошибка NullReferenceException из-за того, что тест выполнялся до ClassInitialize (или так кажется. ClassInitialize находится в базовый класс, так что, возможно, это является причиной этого)

Я исчерпал возможности эффективно использовать Sql CE4 для тестирования. У кого-нибудь есть идеи получше?


Изменить: В конце концов я нашел решение. В моем базовом классе модульного теста EF я инициирую новый экземпляр своего контекста данных, а затем вызываю context.Database.Delete() и context.Database.Create(). Модульные тесты выполняются немного медленнее,


Окончательное редактирование: После нескольких писем с Microsoft выяснилось, что TransactionScope теперь разрешены в SqlCE с последней версией SqlCE. Однако, если вы используете EF4, существуют некоторые ограничения: вы должны явно открыть соединение с базой данных до начала транзакции. В следующем коде показан пример успешного использования Sql CE для модульного / функционального тестирования:
    [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!
        }
    }
10
задан KallDrexx 8 February 2011 в 14:00
поделиться