2012-05-30 17 views
8

Tôi có một lớp học với một loạt các nhà khai thác quá tải:đèo lambda để tham số NUnit thử nghiệm

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

Đối với tất cả chúng tôi muốn thử nghiệm toán hạng cho null. Tôi có một bài kiểm tra NUnit cho rằng:

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àm thế nào tôi có thể vượt qua một lambda cho mỗi nhà khai thác như (l,r) => l + r?

Trả lời

1

Bạn có thể vượt qua một cách chính xác rằng:

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

Tôi nên gọi điều đó ở đâu? Trong hàm tạo của 'TextFixture'? Tôi cũng sử dụng Resharper để chạy thử nghiệm. Nó có thể xử lý chúng theo cách này không? –

+0

@AndreyErmakov: Trong một phương pháp thử nghiệm riêng biệt trên mỗi toán tử. – SLaks

20

Bạn có thể không ngay lập tức áp dụng các thuộc tính TestCase chứa một biểu thức lambda, tức là kiểm tra sau đây sẽ là không hợp lệ:

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

gì bạn có thể làm, tuy nhiên , là sử dụng thuộc tính TestCaseSource cùng với một IEnumerable biểu thức lambda của bạn, như sau:

[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

Cảm ơn vì cách tiếp cận khá hữu ích này. Tôi đã chọn những gì @SLaks cung cấp vì nó cũng giúp tôi nhóm các bài kiểm tra cho từng nhà điều hành. –

+0

Điều gì xảy ra nếu tôi muốn chuyển các đối số khác, không chỉ là một chức năng? –

+0

Bạn có thể tạo một lớp mà thuộc tính là một Func sau đó tạo các thuộc tính khác là những kỳ vọng. Cuối cùng, bạn có thể vượt qua một IEnumerable của lớp mới của bạn. – labilbe