2012-05-30 64 views
8

我有一堆運算符重載的一類:通拉姆達參數化NUnit測試

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

對於所有的人我想測試操作數爲空。我有,一個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)); 
} 

我如何可以通過爲每個操作員像(l,r) => l + r拉姆達?

回答

1

可以傳遞正是:

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

我最好在哪裏打電話?在「TextFixture」的構造函數中?我也使用Resharper來運行測試。它能以這種方式處理它們嗎? –

+0

@AndreyErmakov:每個操作員都有一個單獨的測試方法。 – SLaks

20

不能立即申請包含lambda表達式TestCase的屬性,即下面的測試將是無效的:

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

你能做什麼,但是,就是將TestCaseSource屬性與您的lambda表達式的IEnumerable一起使用,如下所示:

[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

感謝這個相當有用的方法。我選擇了@SLaks提供的內容,因爲它也幫助我爲每個操作員分組測試。 –

+0

如果我想傳遞其他參數而不只是一個函數呢? –

+0

您可以創建一個屬性爲Func 的類,然後創建其他屬性爲期望值。最後,您可以傳遞新類的IEnumerable。 – labilbe