returns remarks cref c# unit-testing

remarks - summary returns c#



Unidad prueba los métodos de vacío? (11)

Como siempre: ¡prueba lo que el método debe hacer!

¿Debería cambiar el estado global (uuh, olor a código) en alguna parte?

¿Debería llamar a una interfaz?

¿Debería arrojar una excepción cuando se llama con los parámetros incorrectos?

¿No debería arrojar una excepción cuando se le llama con los parámetros correctos?

Deberia ...?

¿Cuál es la mejor manera de probar un método que no devuelve nada? Específicamente en c #.

Lo que realmente estoy tratando de probar es un método que toma un archivo de registro y lo analiza para cadenas específicas. Las cadenas se insertan en una base de datos. Nada que no se haya hecho antes pero que sea MUY nuevo para TDD Me pregunto si es posible probar esto o si es algo que realmente no se prueba.


Cualquiera que sea la instancia que esté utilizando para llamar al método de vacío, puede usar Verfiy

Por ejemplo:

En mi caso, _Log es la instancia y LogMessage es el método que se probará:

try { this._log.Verify(x => x.LogMessage(Logger.WillisLogLevel.Info, Logger.WillisLogger.Usage, "Created the Student with name as"), "Failure"); } Catch { Assert.IsFalse(ex is Moq.MockException); }

¿ Verify arroja una excepción debido a la falla del método que la prueba fallaría?


Depende de lo que está haciendo. Si tiene parámetros, pase los simulacros que podría preguntar más adelante si han sido llamados con el conjunto correcto de parámetros.


Es de suponer que el método hace algo, y no simplemente regresa?

Suponiendo que este es el caso, entonces:

  1. Si modifica el estado de su objeto propietario, entonces debe probar que el estado haya cambiado correctamente.
  2. Si toma algún objeto como parámetro y lo modifica, entonces debe probar que el objeto se modificó correctamente.
  3. Si arroja excepciones son ciertos casos, pruebe que esas excepciones se arrojan correctamente.
  4. Si su comportamiento varía en función del estado de su propio objeto u otro objeto, preestablezca el estado y pruebe que el método tiene el valor correcto mediante uno de los tres métodos de prueba anteriores).

Si nos dicen qué hace el método, podría ser más específico.


Prueba esto:

[TestMethod] public void TestSomething() { try { YourMethodCall(); Assert.IsTrue(true); } catch { Assert.IsTrue(false); } }


Prueba sus efectos secundarios. Esto incluye:

  • ¿Lanza alguna excepción? (Si es así, verifique que sí. Si no es así, intente con algunos casos de esquina que podrían serlo si no tiene cuidado; los argumentos nulos son lo más obvio).
  • ¿Funciona bien con sus parámetros? (Si son mutables, ¿los muta cuando no deberían y viceversa?)
  • ¿Tiene el efecto correcto sobre el estado del objeto / tipo al que lo está llamando?

Por supuesto, hay un límite de cuánto puedes probar. Por lo general, no puede realizar pruebas con todas las entradas posibles, por ejemplo. Realice una prueba pragmática: suficiente para darle la confianza de que su código se diseñó de manera adecuada e implementada correctamente, y lo suficiente como para actuar como documentación complementaria de lo que una persona podría esperar.


Si un método no devuelve nada, es uno de los siguientes

  • imperativo - O le está pidiendo al objeto que se haga algo por sí mismo ... por ejemplo, cambiar de estado (sin esperar ninguna confirmación ... se supone que se hará)
  • informativo : simplemente notificando a alguien que algo sucedió (sin esperar acción o respuesta), respectivamente.

Métodos imperativos: puede verificar si la tarea realmente se realizó. Verifique si el cambio de estado realmente tuvo lugar. p.ej

void DeductFromBalance( dAmount )

puede probarse verificando si el saldo publicado después de este mensaje es menor que el valor inicial por dAmount

Los métodos de información son raros como miembros de la interfaz pública del objeto ... por lo tanto, normalmente no se prueban en unidades. Sin embargo, si debe hacerlo, puede verificar si se lleva a cabo el manejo en una notificación. p.ej

void OnAccountDebit( dAmount ) // emails account holder with info

puede ser probado verificando si el correo electrónico se está enviando

Publique más detalles sobre su método real y la gente podrá responder mejor.
Actualización : su método está haciendo 2 cosas. De hecho, lo dividiría en dos métodos que ahora se pueden probar independientemente.

string[] ExamineLogFileForX( string sFileName ); void InsertStringsIntoDatabase( string[] );

String [] se puede verificar fácilmente proporcionando el primer método con un archivo ficticio y cadenas esperadas. El segundo es un poco complicado ... puedes usar un Mock (google o search en frameworks burlones) para imitar el DB o golpear el DB real y verificar si las cadenas fueron insertadas en la ubicación correcta. Revisa este hilo para encontrar algunos buenos libros ... Recomendaría Pragmatic Unit Testing si estás en una crisis.
En el código se usaría como

InsertStringsIntoDatabase( ExamineLogFileForX( "c:/OMG.log" ) );


También debe verificar si el método arroja una excepción.


Use Rhino Mocks para establecer qué llamadas, acciones y excepciones se pueden esperar. Asumiendo que puede burlarse o eliminar partes de su método. Difícil de saber sin conocer algunos detalles aquí sobre el método, o incluso el contexto.


Void return types / Subroutines son viejas noticias. 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()

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 deba devolver para su uso a largo plazo, pero devolver el estado del método una vez que realiza su trabajo es una gran utilidad para la persona que llama.

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, solo usarías

public StateEnum TrySendEmailToCustomer()

Sin embargo, aunque Try-Paradigm responde algo a esta pregunta sobre cómo probar un retorno nulo, también hay otras consideraciones. 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 de n niveles o n 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 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. 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 negocio / objeto de nivel de datos, puede simularlo durante las Pruebas unitarias y no tener dependencias ni temor a las pruebas de integración "Accidental".

Por lo tanto, en tu código de transmisión, pasas un objeto REAL IBusinessDataEtc . Pero en su Prueba de Unidad, usted pasa un objeto IBusinessDataEtc . En ese simulacro, puede incluir propiedades sin interfaz como int XMethodWasCalledCount o algo cuyo estado (s) se actualizan cuando se llaman a los métodos de la interfaz.

Por lo tanto, su Prueba de Unidad irá a través de su (s) Método (s) -In-Pregunta, realizará la lógica que tenga, 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.

  1. El estado de la "Subrutina" que ahora es un método de prueba-paradigma.
  2. El estado de su objeto Mock IBusinessDataEtc .

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 tiene, pero son muy pequeñas y brindan GRANDES aumentos de funcionalidad para una mejor Prueba de Unidad.


tendrá algún efecto sobre un objeto ... consulta para el resultado del efecto. Si no tiene un efecto visible, ¡no vale la pena probarlo!