Преамбула: я разработал сильно интерфейсный и полностью фиктивный класс уровня данных, который ожидает, что бизнес-уровень создаст TransactionScope
, когда несколько вызовов должны быть включены в одну транзакцию.
Проблема: я хочу проверить, использует ли мой бизнес-уровень объект TransactionScope
, когда я этого ожидаю.
К сожалению, стандартный шаблон использования TransactionScope
выглядит следующим образом:
using(var scope = new TransactionScope())
{
// transactional methods
datalayer.InsertFoo();
datalayer.InsertBar();
scope.Complete();
}
Хотя это действительно отличный шаблон с точки зрения удобства использования для программиста, тестирование того, что это сделано, кажется мне... невозможным. Я не могу обнаружить, что временный объект был создан, не говоря уже о том, чтобы смоделировать его, чтобы определить, что для него был вызван метод. Тем не менее, моя цель для освещения подразумевает, что я должен.
Вопрос. Как мне создать модульные тесты, которые гарантируют, что TransactionScope
используется надлежащим образом в соответствии со стандартным шаблоном?
Заключительные мысли. Я рассматривал решение, которое, безусловно, обеспечило бы необходимое мне покрытие, но отклонил его как слишком сложное и не соответствующее стандартному шаблону TransactionScope
. Это включает в себя добавление метода CreateTransactionScope
к моему объекту уровня данных, который возвращает экземпляр TransactionScope
. Но поскольку TransactionScope содержит логику конструктора и невиртуальные методы и, следовательно, его трудно, если вообще возможно, имитировать, CreateTransactionScope
вернет экземпляр DataLayerTransactionScope
, который будет фиктивным фасадом в TransactionScope
.
Хотя это может выполнять работу, это сложно, и я бы предпочел использовать стандартный шаблон. Есть ли способ лучше?