El preámbulo: He diseñado una clase de capa de datos fuertemente interconectado y totalmente mockable que espera que la capa de negocio para crear un TransactionScope
cuando múltiples llamadas deben ser incluidos en una sola transacción.Unidad probando el uso de TransactionScope
El problema es: Me gustaría probar de forma unitaria que mi capa empresarial hace uso de un objeto TransactionScope
cuando lo espero.
Por desgracia, el patrón estándar para el uso de TransactionScope
es la siguiente:
using(var scope = new TransactionScope())
{
// transactional methods
datalayer.InsertFoo();
datalayer.InsertBar();
scope.Complete();
}
Si bien esto es realmente un gran patrón en términos de facilidad de uso para el programador, las pruebas que se hace parece ... unpossible a mí. No puedo detectar que un objeto transitorio haya sido instanciado, y mucho menos simularlo para determinar que un método fue llamado sobre él. Sin embargo, mi objetivo de cobertura implica que debo hacerlo.
La Pregunta: ¿Cómo puedo ir construyendo unidad de pruebas que aseguran TransactionScope
se usa apropiadamente de acuerdo con el patrón estándar?
Consideraciones finales: He pensado en una solución que sin duda proporcionar la cobertura que necesito, pero lo han rechazado como demasiado complejo y que no cumplan el patrón estándar TransactionScope
. Implica agregar un método CreateTransactionScope
en mi objeto de capa de datos que devuelve una instancia de TransactionScope
. Pero como TransactionScope contiene lógica de constructor y métodos no virtuales y, por lo tanto, es difícil, si no imposible, simular, CreateTransactionScope
devolvería una instancia de DataLayerTransactionScope
que sería una fachada simulada en TransactionScope
.
Si bien esto podría hacer el trabajo, es complejo y preferiría usar el patrón estándar. ¿Hay una mejor manera?
Muchas gracias por esta valiosa respuesta! tengo una que. ¿Puedo usar esto con ES DB (NoSQL)? –