2012-05-30 12 views
8

Ich habe eine Klasse mit einer Reihe von überladenen Operatoren:Pass Lambda parametriert NUnit Test

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

Für alle von ihnen Ich mag würde Operanden für null testen. Ich habe einen NUnit Test dafür:

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)); 
} 

Wie kann ich ein Lambda für jeden Betreiber wie (l,r) => l + r passieren?

Antwort

1

können Sie passieren genau das:

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

Wo sollte ich das besser nennen? Im Konstruktor von 'TextFixture'? Ich verwende auch einen Resharper, um Tests durchzuführen. Kann es damit umgehen? –

+0

@AndreyErmakov: In einer separaten Testmethode pro Betreiber. – SLaks

20

Sie können nicht sofort den Testcase Attribut anwenden einen Lambda-Ausdruck enthält, dh der folgende Test ungültig sein würde:

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

Was Sie tun können, aber , verwenden Sie das TestCaseSource-Attribut zusammen mit einem IEnumerable Ihrer Lambda-Ausdrücke, wie folgt:

[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

Danke für diesen recht nützlichen Ansatz. Ich wählte, was @SLaks zur Verfügung stellte, weil es mir auch half, Tests für jeden Operator zu gruppieren. –

+0

Was ist, wenn ich andere Argumente weitergeben will, nicht nur eine Funktion? –

+0

Sie können eine Klasse erstellen, deren Eigenschaft ein Func ist, und dann andere Eigenschaften erstellen, die Erwartungen sind. Schließlich können Sie einen IEnumerable Ihrer neuen Klasse übergeben. – labilbe

Verwandte Themen