2012-06-29 22 views
6

Nói rằng tôi có như sau:Có cách nào để chạy một danh sách các phương thức hành động khác nhau trên một đối tượng trong Nunit bằng TestCase không?

[Test] 
    // would like to parameterize the parameters in call AND the call itself 
    public void Test() 
    { 
     var res1 = _sut.Method1(1); 
     var res2 = _sut.Method2("test"); 
     var res3 = _sit.Method3(3); 

     Assert.That(res1, Is.Null); 
     Assert.That(res2, Is.Null); 
     Assert.That(res3, Is.Null); 
    } 

Tôi muốn parameterize kiểm tra bằng cách sử dụng thuộc tính TestCase/TestCaseSource bao gồm các cuộc gọi riêng của mình. Do tính chất lặp đi lặp lại của các bài kiểm tra, mỗi phương thức cần phải được gọi với các thông số hơi khác nhau, nhưng tôi cần phải có khả năng gắn thẻ một cuộc gọi khác nhau cho từng tham số khác nhau. Điều này thậm chí có thể xảy ra ở Nunit không? Nếu vậy, làm thế nào tôi sẽ đi về nó?

+0

Xin chào. Tôi biết điều này là dễ dàng có thể sử dụng MbUnit ... Với NUnit, tôi nghĩ rằng bạn có thể làm điều đó bằng cách sử dụng một DB và lưu trữ giá trị trong DB này, sau đó parametrize thử nghiệm của bạn với một nguồn dữ liệu – Kek

Trả lời

5

Sử dụng TestCaseSource, bạn sẽ có thể để lặp qua một mảng các giá trị và gọi các phương thức mong muốn, ví dụ như thế này:

[TestFixture] 
public class TestClass 
{ 
    private Sut _sut; 

    public TestClass() 
    { 
    _sut = new Sut(...); 
    } 

    private IEnumerable<object> TestCases 
    { 
    get 
    { 
     var values = new object[,] { { 1, "test", 3 }, { 2, "hello", 0 }, ... }; 

     for (var i = 0; i < values.GetLength(0); ++i) 
     { 
      yield return _sut.Method1((int)values[i,0]); 
      yield return _sut.Method2((string)values[i,1]); 
      yield return _sut.Method3((int)values[i,2]); 
     } 
    } 
    } 

    [TestCaseSource("TestCases")] 
    public void Test(object val) 
    { 
    Assert.That(val, Is.Null); 
    } 
} 

Lưu ý rằng trường hợp _sut cần phải được thuyết minh trong các nhà xây dựng TestClass. Nó không đủ để khởi tạo nó trong một phương thức [SetUp] hoặc [TestFixtureSetUp].

Trong trường hợp bạn cần _sut instantiations khác nhau cho lời gọi phương pháp khác nhau, bạn có thể tạo ra một bộ sưu tập của Sut trường hợp trong các nhà xây dựng, và truy cập có liên quan Sut mục trong for vòng lặp của TestCases getter. Ngoài ra, bạn thậm chí có thể lặp qua tất cả các mặt hàng Sut trong getter ...

+0

Đề xuất thú vị, tuy nhiên tôi nhận được 'không thể chuyển đổi kiểu biểu thức' biểu thức lambda 'thành kiểu Tuple , đối tượng> ... – jaffa

+0

Tôi đã cập nhật ví dụ, nhưng tôi sẽ xem xét mã sâu hơn. Sẽ quay lại càng sớm càng tốt. –

+0

Tôi đã dùng quá liều lần đầu tiên :-) Làm thế nào về ví dụ được cập nhật? –

0

Afaik, không có cơ chế tích hợp như vậy trong NUnit. Tuy nhiên, nếu có nhiều phương pháp tồn tại trong một thử nghiệm, tôi nghĩ rằng đó là cách tốt hơn để tách chúng thành các thử nghiệm riêng biệt.

Điều đó đang được nói, miễn là bạn luôn gọi những phương thức này trên cùng một đối tượng (_sut), bạn có thể làm điều này với sự phản chiếu (cũng nếu bạn quyết định lấy chi phí phát sinh).

Ví dụ, thêm một tham số chuỗi trong TestCaseSource của bạn, và trong phương pháp thử nghiệm gọi nó như thế này:

Type type = _sut.GetType(); 
MethodInfo methodInfo = type.GetMethod(methodName); 
object result = methodInfo.Invoke(_sut, null); 

Mọi thứ sẽ nhanh chóng trở nên phức tạp khi mỗi phương pháp bạn muốn parameterize sẽ mất một số lượng khác nhau của lập luận mặc dù. Gỡ lỗi và xem thử nghiệm nào không thành công cũng sẽ khó hơn nhiều. Tốt nhất là bạn có thể tách các xét nghiệm này.

+0

Vâng tôi loại suy nghĩ trong khi tốt đẹp, nó là overkill . Tôi đã giảm số không. các dòng trong mỗi Test bằng cách tạo các phương thức trợ giúp để không lặp lại quá trình kiểm tra. Tuy nhiên, tôi nghĩ rằng loại điều này sẽ hữu ích trong việc kiểm tra các máy trạng thái ... – jaffa

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