2009-04-29 15 views
11

En NUnit 2.5 se puede hacer esto:prueba paramétrica con métodos genéricos

[TestCase(1,5,7)] 
public void TestRowTest(int i, int j, int k) 
{ 
    Assert.AreEqual(13, i+j+k); 
} 

Se puede hacer la prueba no paramétrica.

Pero me pregunto si puede hacer esto o no, prueba paramétrica con el método de prueba genérico? Es decir .:

[TestCase <int>("Message")] 
public void TestRowTestGeneric<T>(string msg) 
{ 
    Assert.AreEqual(5, ConvertStrToGenericParameter<T>(msg)); 
} 

O algo similar.

Respuesta

22

Aquí es la cita de la nota de lanzamiento de NUnit 2,5 link text

métodos de ensayo con parámetros pueden ser genérico. NUnit deducirá la implementación correcta de para usar según los tipos de los parámetros proporcionados. Los métodos genéricos de prueba son compatibles con clases genéricas y no genéricas.

De acuerdo con esto, es posible tener un método de prueba genérico en una clase no genérica. ¿Cómo?

No entiendo muy bien el comentario de Jeff. En los genéricos de .net se encuentran el tiempo de compilación y el tiempo de ejecución. Podemos usar el reflejo para descubrir el atributo de caso de prueba asociado con un método, descubrir el parámetro genérico y nuevamente usar el reflejo para llamar al método genérico. Funcionará, ¿no?

Actualización: OK, ahora sé cómo y espero que no sea demasiado tarde. Necesita el tipo genérico para estar en la lista de parámetros. Por ejemplo:

[TestCase((int)5, "5")] 
[TestCase((double)2.3, "2.3")] 
public void TestRowTestGeneric<T>(T value, string msg) 
{ 
    Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg)); 
} 
1

crear un método privado y llamar a eso:

[Test] 
    public void TypeATest() 
    { 
     MyTest<TypeA>(); 
    } 

    [Test] 
    public void TypeBTest() 
    { 
     MyTest<TypeB>(); 
    } 

    private void MyTest<T>() 
    { 
     // do test. 
    } 
+0

que tenía usar este método para mi prueba que se veía así: [TestCase (nuevo float [] {1, 2, 3, 4, 5}, nuevo float [] {1, 2, 3, 4, 5}, verdadero)] public void AbleToCompareEqualArrays (T [ ] ar1, T [] ar2, bool expectedValue) –

3

Usted puede hacer a medida GenericTestCaseAttribute

[Test] 
    [GenericTestCase(typeof(MyClass) ,"Some response", TestName = "Test1")] 
    [GenericTestCase(typeof(MyClass1) ,"Some response", TestName = "Test2")] 
    public void MapWithInitTest<T>(string expectedResponse) 
    { 
     // Arrange 

     // Act 
     var response = MyClassUnderTest.MyMethod<T>(); 

     // Assert 
     Assert.AreEqual(expectedResponse, response); 
    } 

Aquí consiste en la realización de GenericTestCaseAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class GenericTestCaseAttribute : TestCaseAttribute, ITestBuilder 
{ 
    private readonly Type _type; 
    public GenericTestCaseAttribute(Type type, params object[] arguments) : base(arguments) 
    { 
     _type = type; 
    } 

    IEnumerable<TestMethod> ITestBuilder.BuildFrom(IMethodInfo method, Test suite) 
    { 
     if (method.IsGenericMethodDefinition && _type != null) 
     { 
      var gm = method.MakeGenericMethod(_type); 
      return BuildFrom(gm, suite); 
     } 
     return BuildFrom(method, suite); 
    } 
} 
+1

Gracias por esto, he estado luchando durante días para hacerlo bien y tu respuesta me ayudó a hacerlo bien. – AzP

Cuestiones relacionadas