Из-за потенциальных различий между 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 для тестирования. У кого-нибудь есть идеи получше?
context.Database.Delete()
и context.Database.Create()
. Модульные тесты выполняются немного медленнее,
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!
}
}