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