2011-01-27 42 views
19

Tôi muốn viết một hàm có thể gọi chấp nhận hai đối tượng và so sánh 30 thuộc tính của các đối tượng đó với các xác nhận. Vấn đề là điều này cần phải được thực hiện cho khoảng 20 bài kiểm tra đơn vị hiện có và hầu hết các bài kiểm tra trong tương lai, và viết ra hơn 30 lời khẳng định mỗi lần đều tốn thời gian và không gian.Có thể tham số hóa một bài kiểm tra nunit

Tôi hiện đang có một hàm kiểm tra không đơn vị so sánh các đối tượng và trả về một chuỗi có thông báo lỗi hoặc thông báo lỗi và sử dụng xác nhận để xác thực điều đó trong mỗi bài kiểm tra đơn vị. Tuy nhiên, nó khá lộn xộn và tôi cảm thấy như tôi đang đi ngược lại phương pháp thử nghiệm đơn vị thích hợp.

Có cách nào để thực hiện một chức năng có thể gọi từ các thử nghiệm đơn vị bên trong có sử dụng các xác nhận để kiểm tra điều kiện không?

Trả lời

17

Để trả lời phần cuối cùng, bạn có thể tất nhiên phải khẳng định của bên chức năng khác. Khẳng định công việc bằng cách tăng trường hợp ngoại lệ mà bắt kiểm tra Á hậu, và giải thích như là một thất bại, vì vậy có một thử nghiệm như vậy sẽ làm việc tốt:

public void CheckAsserts(string value) 
{ 
    Assert.IsNotNull(value); 
} 

[TestCase("yes!")] 
public void MyTest(string value) 
{ 
    CheckAsserts(value); 
} 
+0

Thats chính xác những gì tôi đã cố gắng để làm, nhưng với hai tham số. Tôi đã có chức năng như một trường hợp thử nghiệm mà tôi nghĩ là vấn đề của tôi. Cảm ơn – NewNetProgrammer

4

Có, kiểm tra đơn vị giống như bất kỳ mã nào khác.

Cụ thể, hãy xem NUnit.TestCaseAttribute.

+0

Tôi đã xem xét điều đó nhưng không thể xem cách thiết lập thông số động. Tôi muốn so sánh hơn 20 đối tượng được tạo thủ công với các đối tượng được tự động điền từ cơ sở dữ liệu. Tạo một hàm void với các xác nhận (không phải là một test test) và gọi nó từ các test unit của tôi đã làm việc một cách hoàn hảo. Cảm ơn – NewNetProgrammer

32

Nếu bạn đang sử dụng NUnit 2.5.5 trở lên, điều này có thể sử dụng thuộc tính TestCase.

kiểm tra đơn vị bình thường sẽ được trang trí với [Test], nhưng chúng tôi có thể thay thế đó như sau:

[TestCase("0", 1)] 
[TestCase("1", 1)] 
[TestCase("2", 1)] 
public void UnitTestName(string input, int expected) 
{ 
    //Arrange 

    //Act 

    //Assert 
} 

Đó là loại điều sẽ là cách để làm điều đó - rõ ràng là mất params khác nhau.

Nhìn vào này để được giúp đỡ: http://nunit.org/?p=testCase&r=2.5

+0

Vấn đề là, các trường hợp thử nghiệm của tôi không tĩnh. Tôi có một đối tượng được điền thủ công và một đối tượng được điền từ cơ sở dữ liệu mà tôi muốn so sánh. – NewNetProgrammer

+0

'dự kiến' thay vì phải là kiểu trả về của thử nghiệm được parametrized và bạn nên cung cấp các trường hợp thử nghiệm có giá trị trả về thay vì tham số. –

0

Bạn sẽ cần các thuộc tính TestCase:

[TestCase("string1",...) 
public void test_UnitTest(string Parameter) 
{ 
    ... 
    Assert.AreEqual(Parameter, result) 
} 

Lưu ý rằng điều này chỉ làm việc với các kiểu dữ liệu nguyên thủy như các chuỗi và ints - bạn không thể nhanh chóng của bạn lớp riêng và sử dụng nó làm tham số.

+0

Vấn đề là tôi đang sử dụng đối tượng lớp của riêng tôi với hơn 30 thuộc tính mà tôi muốn so sánh. – NewNetProgrammer

1

Bạn có thể sử dụng thuộc tính TestCase:

[TestCase("hostname1parameter")] 
[TestCase("hostname2parameter")] 
public void Example_TestHostName(string hostname) 
{ 
    ... 
} 
0

Bạn cũng có thể hưởng lợi từ việc sử dụng C# mẫn. Điều này cho phép bạn lấy tên của các trường mà không chỉ định chúng trong mã. Sau đó, bạn có thể gọi chúng theo tên.

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

Điều này cho phép bạn viết một số loại kiểm tra nhất định sẽ áp dụng cho các lớp bạn chưa viết.

Các vấn đề liên quan