2013-08-28 43 views
10

Về cơ bản, tôi muốn có thể thêm các phương thức vào một TestCase hoặc TestFixture trong NUnit để thay đổi hành vi. Về bản chất tôi muốn làm điều này:Có cách nào để chuyển các đại biểu đến một NUnit TestCase hoặc TestFixture không?

[TestFixture] 
public class MethodTests 
{ 
    public delegate void SimpleDelegate(); 

    public static void A() 
    { 
     // Do something meaningful 
    } 

    public static void B() 
    { 
     // Do something meaningful 
    } 

    public static void C() 
    { 
     // Do something meaningful 
    } 

    [TestCase(A,B,C)] 
    [TestCase(C,A,B)] 
    [TestCase(C,B,A)] 
    public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
    { 
     action1(); 
     action2(); 
     action3(); 
    } 
} 

Các lỗi tôi nhận được lại cho [TestCase (A, B, C)] là

  • Lỗi 6 Đối số 1: không thể chuyển đổi từ 'nhóm phương pháp' để 'đối tượng'
  • Lỗi 7 Đối số 2: không thể chuyển đổi từ 'phương pháp nhóm' thành 'đối tượng'
  • Lỗi 8 Đối số 3: không thể chuyển đổi từ 'phương pháp nhóm' thành 'đối tượng'

Bạn có biết nếu có cách nào để có được điều này hoặc một cái gì đó giống như nó để làm việc?

Trả lời

15

Đây là nơi số TestCaseSourceAttribute được giải cứu.

Trước tiên, xác định mảng đối tượng chứa danh sách các trường hợp kiểm tra của bạn. Tiếp theo, gọi các trường hợp thử nghiệm bằng cách tham chiếu đến mảng đối tượng là [TestCaseSource] của Test. Điều này sẽ xây dựng và chạy như bạn dự định.

private static readonly object[] TestCases = 
{ 
    new SimpleDelegate[] { A, B, C }, 
    new SimpleDelegate[] { C, A, B }, 
    new SimpleDelegate[] { C, B, A } 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, 
       SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

Nếu bạn cần một danh sách đối số phức tạp hơn, bạn có thể ví dụ như sử dụng Tuple thay vì SimpleDelegate[] để tạo danh sách đối số mạnh mẽ gõ.

2

Xây dựng về câu trả lời tốt Anders':

Bạn có thể sử dụng các loại NUnit TestCaseData thay vì mảng của đại biểu.

Điều này có một số lợi thế. Đầu tiên, bạn có thể chuyển các tham số của nhiều kiểu cho phương thức thử nghiệm. (Không cần thiết trong trường hợp này, nhưng nó hữu ích trong trường hợp của tôi.) Thứ hai, bạn có thể thêm các thuộc tính hơn nữa vào đối tượng TestCaseData. Trong trường hợp của tôi, tôi đã sử dụng .SetName để thêm tên vào mỗi trường hợp kiểm tra để giao diện NUnit xác định rõ ràng trường hợp kiểm tra đang chạy. Để sửa đổi ví dụ của Anders:

private static readonly object[] TestCases = 
{ 
    new TestCaseData(A, B, C).SetName("A B C"), 
    new TestCaseData(C, A, B).SetName("C A B"), 
    new TestCaseData(C, B, A).SetName("C B A") 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

Như Anders đề cập, người ta có thể sử dụng Tuples để hỗ trợ danh sách đối số phức tạp hơn; nhưng dự án của tôi nằm trong .Net 3.5 không hỗ trợ Tuples.