Los tipos de retorno nulo / subrutinas son viejas noticias. No he hecho un tipo de devolución de Vacío (a menos que haya sido extremadamente flojo) en aproximadamente 8 años (desde el momento de esta respuesta, así que un poco antes de que se hiciera esta pregunta).
En lugar de un método como:
public void SendEmailToCustomer()
Cree un método que siga el paradigma int. TryParse () de Microsoft:
public bool TrySendEmailToCustomer()
Tal vez no haya ninguna información que su método necesite devolver para su uso a largo plazo, pero devolver el estado del método después de que realiza su trabajo es de gran utilidad para la persona que llama.
Además, bool no es el único tipo de estado. Hay varias veces en que una Subrutina hecha anteriormente podría devolver tres o más estados diferentes (Bueno, Normal, Malo, etc.). En esos casos, solo usarías
public StateEnum TrySendEmailToCustomer()
Sin embargo, aunque el Try-Paradigm responde de alguna manera a esta pregunta sobre cómo probar un retorno nulo, también hay otras consideraciones. Por ejemplo, durante / después de un ciclo "TDD", usted estaría "Refactorizando" y notaría que está haciendo dos cosas con su método ... rompiendo así el "Principio de responsabilidad única". Entonces eso debe ser atendido primero. En segundo lugar, es posible que haya idenetizado una dependencia ... está tocando datos "persistentes".
Si está haciendo las cosas de acceso a datos en el método en cuestión, necesita refactorizar en una arquitectura de n niveles o capas. Pero podemos suponer que cuando dice "Las cadenas se insertan en una base de datos", en realidad quiere decir que está llamando a una capa de lógica de negocios o algo así. Ya, asumiremos eso.
Cuando se instancia su objeto, ahora comprende que su objeto tiene dependencias. Esto es cuando necesita decidir si va a hacer una inyección de dependencia en el objeto o en el método. Eso significa que su constructor o el método en cuestión necesita un nuevo parámetro:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Ahora que puede aceptar una interfaz de su objeto de negocio / nivel de datos, puede simularla durante las pruebas unitarias y no tener dependencias ni temor a las pruebas de integración "accidentales".
Entonces, en su código en vivo, pasa un IBusinessDataEtc
objeto REAL . Pero en su Prueba de unidad, pasa un IBusinessDataEtc
objeto MOCK . En ese simulacro, puede incluir propiedades que no sean de interfaz int XMethodWasCalledCount
o algo cuyos estados se actualicen cuando se invoquen los métodos de interfaz.
Por lo tanto, su Prueba de unidad pasará por su (s) Método (s) en cuestión, realizará cualquier lógica que tengan y llamará a uno o dos, o un conjunto seleccionado de métodos en su IBusinessDataEtc
objeto. Cuando haces tus Afirmaciones al final de tu Prueba de Unidad, tienes un par de cosas que probar ahora.
- El estado de la "subrutina", que ahora es un método Try-Paradigm.
- El estado de su
IBusinessDataEtc
objeto simulado .
Para obtener más información sobre las ideas de inyección de dependencias en el nivel de construcción ... en lo que respecta a las pruebas unitarias ... consulte los patrones de diseño del generador. Agrega una interfaz y clase más para cada interfaz / clase actual que tenga, pero son muy pequeñas y proporcionan ENORMES aumentos de funcionalidad para una mejor Prueba de Unidad.