2010-02-18 13 views
6

Estoy usando el atributo NUnit 2.5.3 TestCaseSource y estoy creando una fábrica para generar mis pruebas. Algo como esto:NUnit TestCaseSource pasar el valor a la fábrica

[Test, TestCaseSource(typeof(TestCaseFactories), "VariableString")] 
public void Does_Pass_Standard_Description_Tests(string text) 
{ 
    Item obj = new Item(); 
    obj.Description = text; 
} 

Mi fuente es la siguiente:

public static IEnumerable<TestCaseData> VariableString 
{ 
    get 
    { 
     yield return new TestCaseData(string.Empty).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Empty_Text"); 
     yield return new TestCaseData(null).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Null_Text"); 
     yield return new TestCaseData(" ").Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Whitespace_Text"); 
    } 
} 

Lo que necesito para ser capaz de hacer es añadir un cheque longitud máxima de la variable de cadena, pero esta longitud máxima se define en los contratos en la clase bajo prueba. En nuestro caso es una estructura pública simple:

public struct ItemLengths 
    { 
     public const int Description = 255; 
    } 

No encuentro ninguna forma de pasarle un valor al generador de casos de prueba. Intenté valores compartidos estáticos y estos no se recogen. No quiero guardar cosas en un archivo, ya que necesitaría regenerar este archivo cada vez que cambiara el código.

Quiero añadir la siguiente línea a mi caso_prueba:

yield return new TestCaseData(new string('A', MAX_LENGTH_HERE + 1)) 
    .Throws(typeof(PreconditionException)); 

Algo bastante simple en concepto, pero algo me está resultando imposible de hacer. ¿Alguna sugerencia?

Respuesta

2

Cambia el parámetro de tu prueba como clase en lugar de cadena. Como tal:

clase pública StringTest { cadena pública testString; public int maxLength; }

A continuación, construya esta clase para pasar como argumento al constructor TestCaseData. De esa manera puede pasar la cadena y cualquier otro argumento que desee.

Otra opción es hacer que la prueba tenga 2 argumentos de cadena e int.

Luego, para TestCaseData ("mystring", 255). ¿Te diste cuenta de que pueden tener múltiples argumentos?

Wayne

1

que se enfrentó a un problema similar como la suya y terminó escribiendo un pequeño complemento NUnit y un atributo personalizado que se extiende la NUnit TestCaseSourceAttribute. En mi caso particular, no estaba interesado en pasar los parámetros al método de fábrica, pero podría usar fácilmente la misma técnica para lograr lo que desea.

No fue tan difícil y solo me requirió escribir algo así como tres clases pequeñas. Puede leer más sobre mi solución en: blackbox testing with nunit using a custom testcasesource.

PS. Para usar esta técnica debes usar NUnit 2.5 (al menos) Buena suerte.

Cuestiones relacionadas