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