У меня есть пара таблиц с родительскими/дочерними отношениями - инцидент и инцидент. У меня есть viewmodel, который содержит информацию из обеих этих таблиц. И у меня есть метод бизнес-уровня, которому передается экземпляр viewmodel, который должен обновлять обе таблицы.
Итак, в методе я использую новый механизм транзакций EF6:
using (var transaction = this.db.Database.BeginTransaction())
{
try
{
// various database stuff
this.db.SaveChanges();
// more database stuff
this.db.SaveChanges();
// yet more database stuff
this.db.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
this.logger.logException(ex, "Exception caught in transaction, rolling back");
throw;
}
}
Итак, моя проблема. Как проверить это?
Я использую платформу тестирования модулей Microsoft с помощью Moq, и у меня не было проблем с издевательством DBContexts и DbSet < > s, но я не могу понять, как обойти транзакционные вещи.
Если я не пытаюсь издеваться над транзакцией, я получаю InvalidOperationException:
"В приложении не может быть найдена соединительная строка с именем xxx config."
Что имеет смысл - нет файла конфигурации приложения, и нет никакой базы данных.
Но если я попытаюсь высмеять BeginTransaction(), я получу ошибки инициализации: NotSupportedException:
"Неверная настройка для не виртуального элемента: m = > m.Database.BeginTransaction".
И это заставило меня преследовать сорняки, глядя на декомпилирующие методы .NET, пытаясь определить какой-то класс, который может быть получен из удобного интерфейса или что-то еще, где я мог бы каким-то образом ввести насмешливый объект.
Я не пытаюсь выполнить блок-транзакцию MS-транзакции - я просто хочу убедиться, что соответствующие изменения внесены в соответствующие записи в каждой из таблиц. Но по мере того как он сидит, похоже, что это не проверяемое, и что любой метод, который использует транзакции, не поддается тестированию. И это просто боль.
У меня Googled вокруг, и не нашел ничего полезного. Кто-нибудь сталкивался с этой проблемой? У кого-нибудь есть идеи о том, как действовать?