¿Cómo desacoplar un nivel medio y un conjunto de datos para permitir la prueba de la unidad?
-
03-07-2019 - |
Pregunta
Tengo una pregunta en SO preguntando cómo conectar un nivel medio a un DataSet.
Puse una respuesta mostrando lo que había encontrado, pero no estoy contento con el acoplamiento apretado. Acabo de comenzar a realizar pruebas y creo que es un buen objetivo para mi código.
¿Cómo se desacoplaría este código para permitir la prueba unitaria?
Gracias,
Keith
Solución
IMO; Los conjuntos de datos son malvados. Son, y solo deben usarse como bases de datos fuera de línea. Nada más, IMO. Sin embargo, lo que haga en su capa de acceso a datos (DAL) no debería afectar realmente a su capa de negocios (BL). Solo usaría objetos (usar interfaces) entre ellos (IList) y luego utilizaría una interfaz para definir su DAL (IRepository) y el nyou puede simularse de esa interfaz para devolver lo que necesite en su BL para pruebas de unidad. Pruebas unitarias Los conjuntos de datos son otra bestia, nunca lo probé y espero que nunca tenga que ... Quizás una mejor base de datos en la memoria es ...
Ah, y para burlarme he usado RhinoMock con cierto éxito. También lo aliento a que busque en IoCs ( http://www.castleproject.org/ ).
Otros consejos
Necesita IOC (inversión de control) y objetos simulados.
Lo invito a ver dnrTV episode 126 con James Kovacs.
Demuestra exactamente lo que estás buscando.
¿Has probado Spring.net ? Hará su código más limpio y menos acoplado. También proporciona clases útiles para hacer tus pruebas de integración.
Depende de lo que quieras probar:
- ¿Desea probar la recuperación de datos de la base de datos?
- ¿Construyendo los objetos a partir de los conjuntos de datos?
- ¿Se inserta o actualiza la base de datos?
- Y así sucesivamente ...
Aquí hay una sugerencia:
Una orden contiene todos sus hijos. Esto es un agregado, un todo. Obtienes un pedido con detalles de un repositorio:
var order = repository.GetOrderBy(id);
El repositorio obtiene los datos de la base de datos:
var dataset = orderDatabase.GetOrderAndDetailsBy(id);
El repositorio podría usar un generador para crear el orden:
var order = orderBuilder.CreateOrderAndDetailsFrom(dataset);
Tendría que crear un repositorio de la siguiente manera:
var repository = new OrderRepository(orderDatabase, orderBuilder);
Ahora puedes crear un repositorio con colaboradores falsos, dependiendo de lo que quieras probar.
Si tiene objetos de entidad, puede usar simulacros para realizar pruebas unitarias en su nivel intermedio.