2012-05-30 10 views
8

tengo una clase con un grupo de operadores sobrecargados:Pass lambda para parametrizado NUnit prueba

public static double[,] operator +(Matrix matrix, double[,] array) 
public static double[,] operator -(Matrix matrix, double[,] array) 
public static double[,] operator *(Matrix matrix, double[,] array) 

Para todos ellos me gustaría probar operandos para nulo. Tengo una prueba de que NUnit:

public void MatrixOperatorOperandIsNullThrows(Func<Matrix, double[,], double[,]> op) 
{ 
    Matrix m = null; 
    var right = new double[,] {{1, 1}, {1, 1}}; 
    Assert.Throws<ArgumentException>(() => op(m, right)); 
} 

¿Cómo puedo pasar una lambda para cada operador como (l,r) => l + r?

Respuesta

1

Puede pasar exactamente eso:

MatrixOperatorOperandIsNullThrows((l,r) => l + r); 
+0

¿Dónde mejor llamarlo? En el constructor de 'TextFixture'? También uso un Resharper para ejecutar pruebas. ¿Puede manejarlos de esta manera? –

+0

@AndreyErmakov: en un método de prueba separado por operador. – SLaks

20

no se puede aplicar de inmediato el atributo TestCase que contiene una expresión lambda, es decir, la siguiente prueba sería válida:

[TestCase((a, b) => a + b)] 
public void WillNotCompileTest(Func<double, double, double> func) 
{ 
    Assert.GreaterOrEqual(func(1.0, 1.0), 1.0); 
} 

lo que puede hacer, sin embargo , es utilizar el atributo TestCaseSource junto con un IEnumerable de sus expresiones lambda, como este:

[TestFixture] 
public class TestClass 
{ 
    private IEnumerable<Func<double, double, double>> TestCases 
    { 
     get 
     { 
      yield return (a, b) => a + b; 
      yield return (a, b) => a * b; 
      yield return (a, b) => a/b; 
     } 
    } 

    [TestCaseSource("TestCases")] 
    public void Test(Func<double, double, double> func) 
    { 
     Assert.GreaterOrEqual(func(1.0, 1.0), 1.0); 
    } 
} 
+0

Gracias por este enfoque bastante útil. Elegí lo que @SLaks me proporcionó porque también me ayudó a agrupar las pruebas para cada operador. –

+0

¿Qué sucede si quiero pasar otros argumentos, no solo una función? –

+0

Puede crear una clase cuya propiedad sea un Func y luego crear otras propiedades que sean expectativas. Finalmente puede pasar un IEnumerable de su nueva clase. – labilbe

Cuestiones relacionadas