Void return types/Subroutines son noticias viejas. No he hecho un tipo de devolución de Vacío (a menos que estuviese siendo extremadamente flojo) en 8 años (desde el momento de esta respuesta, tan solo un poco antes de que se hiciera esta pregunta).
En lugar de un método como:
public void SendEmailToCustomer()
Hacer un método que sigue int de Microsoft.TryParse() paradigma:
public bool TrySendEmailToCustomer()
Tal vez no hay ninguna información de su método necesita para volver para su uso en el largo plazo, pero volviendo al estado del método después de que realiza su trabajo es una gran utilidad para el llamador.
Además, bool no es el único tipo de estado. Hay una serie de veces en que una Subrutina previamente creada podría devolver tres o más estados diferentes (Bueno, Normal, Malo, etc.). En esos casos, usted sólo tiene que utilizar
public StateEnum TrySendEmailToCustomer()
Sin embargo, mientras que el Try-Paradigma un tanto responde a esta pregunta en la forma de probar un retorno vacío, hay otras consideraciones también. Por ejemplo, durante/después de un ciclo de "TDD", estaría "Refactorizando" y notará que está haciendo dos cosas con su método ... rompiendo así el "Principio de Responsabilidad Individual". Así que eso debería ser atendido primero. En segundo lugar, es posible que haya idenetificado 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 n-tier'd o n-layer'd. 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 crea una instancia de su objeto, ahora comprende que su objeto tiene dependencias. Aquí es cuando necesita decidir si va a hacer Inyección de Dependencia en el Objeto, o en el Método. Esto 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 se puede aceptar una interfaz de su objeto/capa de datos de negocios, puede burlarse de ella durante las pruebas unitarias y no tienen dependencias o miedo a las pruebas de integración "Accidental".
Por lo tanto, en su código de transmisión, pasa un objeto REAL IBusinessDataEtc
. Pero en tu Prueba de Unidad, pasas en un objeto MOCK IBusinessDataEtc
. En ese simulacro, puede incluir propiedades que no sean de interfaz como int XMethodWasCalledCount
o algo cuyo estado se actualice cuando se invocan los métodos de interfaz.
Por lo tanto, su Prueba Unitaria pasará por su (s) Método (s) -In-Question, ejecutará cualquier lógica que tengan, y llamará a uno o dos, o un conjunto seleccionado de métodos en su objeto IBusinessDataEtc
. Cuando haces tus Afirmaciones al final de tu Prueba de Unidad tienes un par de cosas para probar ahora.
- El estado de la "Subrutina" que ahora es un método Try-Paradigm.
- El estado de su Mock
IBusinessDataEtc
objeto.
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 de la unidad ... consulte los patrones de diseño del generador. Agrega una interfaz y clase más para cada interfaz/clase actual que tiene, pero son muy pequeñas y brindan GRANDES aumentos de funcionalidad para una mejor Prueba de Unidad.
No utilice el término "TDD" si eso no es lo que está haciendo. Estás haciendo pruebas unitarias, no TDD. Si estuvieras haciendo TDD, nunca tendrías una pregunta como "cómo probar un método". La prueba existiría primero, y luego la pregunta sería, "¿cómo pasar esta prueba?" Pero si estuvieras haciendo TDD, tu código se escribiría para la prueba (y no al revés), y esencialmente terminarías respondiendo tu propia pregunta. Su código se formateará de forma diferente como resultado de TDD, y este problema nunca ocurrirá. Solo aclarando. – Suamere