2009-09-02 14 views

Respuesta

13

La coincidencia más cercana es Assert.Inconclusive() - no hace que la prueba falle como tal, pero tampoco funciona. Cae en una tercera etapa llamada No concluyente.

Una única prueba no concluyente causará que un conjunto de pruebas completo no sea concluyente.

Hay sobrecargas que soporta mensajes personalizados, así:

Assert.Inconclusive("Ploeh"); 
+6

Resulta molesto que una prueba no concluyente sea suficiente para hacer que MSTEST.EXE devuelva el mismo código de estado (1) como error, por lo que si está utilizando un archivo por lotes para configurarlo no podrá notar la diferencia sin más trabajo. –

3

Tengo un problema similar como yo uso NUnit para algunos proyectos. Trate de usar

Console.Write("Some Warning"); 
+3

Assert.Inconclusive(); es compatible con NUnit en realidad. http://www.nunit.org/index.php?p=utilityAsserts&r=2.5.8 –

1

Aquí está mi piratear sobre cómo tener advertencias con nunit (Sé que esta pregunta era acerca mstest, pero esto debería funcionar también). Como siempre, estoy interesado en cualquier mejora. Este método me funciona.

Antecedentes: Tengo un código que comprueba los propios comentarios para obtener comentarios correctos y tiene lógica para detectar si alguien ha copiado y pegado otra prueba sin cambiar los comentarios. Estas son advertencias Quiero que se muestre al desarrollador sin Assert.Inconclusive normal bloqueando la ejecución de la prueba real. Algunos se centran en la prueba y la fase de refactorización de limpieza consiste en eliminar las advertencias.

Misión: tener advertencias después de que se ejecuten todos los demás asertos. Esto significa que incluso muestra las advertencias después de Assert.Fail que normalmente ocurre en las pruebas durante el desarrollo.

Implementación: (mejor esfuerzo para 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); 
      } 
     } 
    } 

Pruebas de Uso

[Test] 
public void Sample_Test() 
{ 
    if (condition) Warning.AppendLine("Developer warning"); 
    Assert.Fail("This Test Failed!"); 
} 

Resultado real:

"This Test Failed!" 
"Developer warning" 

El estado de la prueba ha fallado - ROJO

Si la prueba pasó y hubo una advertencia, obtendrá el estado de Inconclusive - AMARILLO.

0

Es posible que desee utilizar una excepción personalizada.

El problema con Assert.Incluso es que Test Explorer indica que la prueba ni siquiera se ejecutó. Esto puede inducir a error al ejecutar la prueba en el futuro, sobre todo si se realiza la prueba por otros desarrolladores:

enter image description here

La forma en que he llegado a preferir es el siguiente. En primer lugar, defina un UnitTestWarningException personalizado. Le he dado a la mía un constructor adicional para que pueda pasar mi mensaje de advertencia Cadena.Formato de estilo con argumentos:

public class UnitTestWarningException : Exception 
{ 
    public UnitTestWarningException(string Message) : base(Message) { } 

    public UnitTestWarningException(string Format, params object[] Args) : base(string.Format(Format, Args)) { } 
} 

A continuación, en el punto donde desea finalizar una prueba de unidad con una advertencia, lanzar una UnitTestWarningException lugar:

[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: el Explorador de prueba a continuación, muestra que la prueba ha sido ejecutado, pero no con un UnitTestWarningException que muestra su advertencia:

enter image description here