c# - Equivalente de assert.warning in mstest?
unit-testing mbunit (4)
Aquí está mi truco sobre cómo tener advertencias con nunit (sé que esta pregunta era sobre mstest, pero esto también debería funcionar). Como siempre, estoy interesado en cualquier mejora. Este método está funcionando para mí.
Antecedentes: tengo un código que verifica las pruebas en sí para detectar los comentarios correctos y tiene lógica para detectar si alguien copió y pegó otra prueba sin cambiar los comentarios. Estas son advertencias que quiero que se muestren al desarrollador sin Assert normal. El bloqueo no se ejecuta de forma concluyente. Algunos se centran en la prueba y la fase de refactorizaciones de limpieza consiste en eliminar las advertencias.
Misión : tener advertencias después de ejecutar todas las demás afirmaciones. Esto significa incluso mostrar las advertencias después de Assert.Fail que normalmente ocurren en las pruebas durante el desarrollo.
Implementación : (mejor crear una clase base para todos los archivos de prueba):
public class BaseTestClass
{
public static StringBuilder Warnings;
[SetUp]
public virtual void Test_SetUp()
{
Warnings = new StringBuilder();
}
[TearDown]
public virtual void Test_TearDown()
{
if (Warnings.Length > 0)
{
string warningMessage = Warnings.ToString();
//-- cleared if there is more than one test running in the session
Warnings = new StringBuilder();
if (TestContext.CurrentContext.Result.Status == TestStatus.Failed)
{
Assert.Fail(warningMessage);
}
else
{
Assert.Inconclusive(warningMessage);
}
}
}
Uso de prueba
[Test]
public void Sample_Test()
{
if (condition) Warning.AppendLine("Developer warning");
Assert.Fail("This Test Failed!");
}
Resultado actual:
"This Test Failed!"
"Developer warning"
Estado de prueba fallido - ROJO
Si la prueba pasó y hubo una advertencia, entonces obtendrá el estado Inconclusive - AMARILLO.
¿hay un equivalente de prueba de MSS en Assert.Warning en MbUnit?
Es posible que desee utilizar una excepción personalizada.
El problema con Assert.Inconclusive es que Test Explorer indica que la prueba ni siquiera se ejecutó. Esto puede ser engañoso cuando se ejecute la prueba en el futuro, particularmente si otros desarrolladores ejecutan la prueba:
La forma en que he llegado a preferir es la siguiente. En primer lugar, defina una UnitTestWarningException
personalizada. Le he dado a mi un constructor adicional para que pueda pasar mi mensaje de advertencia String.Format-style con argumentos:
public class UnitTestWarningException : Exception
{
public UnitTestWarningException(string Message) : base(Message) { }
public UnitTestWarningException(string Format, params object[] Args) : base(string.Format(Format, Args)) { }
}
Luego, en el punto en el que desea finalizar una prueba de unidad con una advertencia, en su lugar, lance una UnitTestWarningException
:
[TestMethod]
public void TestMethod1()
{
.
.
.
try
{
WorkflowInvoker.Invoke(workflow1, inputDictionary);
}
catch (SqlException ex)
{
if (ex.Errors.Count > 0
&& ex.Errors[0].Procedure == "proc_AVAILABLEPLACEMENTNOTIFICATIONInsert")
{
//Likely to occur if we try to repeat an insert during development/debugging.
//Probably not interested--the mail has already been sent if we got as far as that proc.
throw new UnitTestWarningException("Note: after sending the mail, proc_AVAILABLEPLACEMENTNOTIFICATIONInsert threw an exception. This may be expected depending on test conditions. The exception was: {0}", ex.Message);
}
}
}
El resultado: Test Explorer muestra que la prueba se ha ejecutado, pero falló con una excepción UnitTestWarningException
que muestra su advertencia:
Tengo un problema similar, ya que uso NUnit para algunos proyectos. Intenta usar
Console.Write("Some Warning");
La coincidencia más cercana es Assert.Inconclusive()
: no hace que la prueba falle como tal, pero tampoco tiene éxito. Cae en una tercera etapa llamada Inconcluyente .
Una sola prueba no concluyente hará que todo un conjunto de pruebas sea no concluyente.
Hay sobrecargas que también admiten mensajes personalizados:
Assert.Inconclusive("Ploeh");