2011-11-17 35 views
9

Tôi đang học cách sử dụng kiểm tra đơn vị, tôi tạo một dự án, thêm tham chiếu xunit. Và mã sau:tại sao xunit không cho phép thử nghiệm một phương thức với các tham số?

namespace UnitTestProject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [Fact] 
     private void test(int number1, string number2) 
     { 

      int result = number1 + Convert.ToInt32(number2); 
      Assert.IsType(Type.GetType("Int32"), result); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Khi tôi chạy thử nghiệm sử dụng công cụ xUnit gui, nó nói:

UnitTestProject.Form1.test: System.InvalidOperationException: Fact phương pháp UnitTestProject.Form1.test không thể có các thông số stack Trace: 於 Xunit.Sdk.FactCommand.Execute (Object TestClass)
Xunit.Sdk.FixtureCommand.Execute (Object TestClass)
Xunit.Sdk.BeforeAfterCommand.Execute (Object TestClass)
Xunit.Sdk.LifetimeCommand.Execute (Object TestClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (Object TestClass)

Vì vậy, làm thế nào tôi có thể kiểm tra các phương pháp/chức năng với các thông số?

Trả lời

18

Ngoài ra bạn có thể sử dụng [Theory] thay vì [Fact]. Nó sẽ cho phép bạn tạo các phương thức thử nghiệm với các tham số khác nhau. Ví dụ:

[Theory] 
[InlineData(1, "22")] 
[InlineData(-1, "23")] 
[InlineData(0, "-25")] 
public void test(int number1, string number2) 
{ 
    int result = number1 + Convert.ToInt32(number2); 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

p.s. Với xUnit nó sẽ là tốt hơn để làm cho phương pháp thử nghiệm công khai.

+0

cảm ơn, nhưng tôi có thể thiết lập các InlineData trong giá trị ngẫu nhiên? Hay tốt hơn để nói, InlineData chấp nhận phương thức/biến nội tuyến? – Cheung

+0

Bạn có thể tại sao không. Xem một ví dụ bẩn dưới đây. – Alina

+1

@Shiba nói chung bạn không nên sử dụng các giá trị ngẫu nhiên trong các thử nghiệm của mình. Trong phương pháp ví dụ của bạn nếu một số ngẫu nhiên không thành công, bạn sẽ không có ý tưởng về những con số gây ra vấn đề. Cố gắng làm cho các xét nghiệm của bạn xác định, và nạp vào một loạt các đầu vào mong đợi, bất ngờ và cực đoan. – DaveShaw

2

Làm thế nào xunit biết những gì cần cung cấp dưới dạng giá trị cho các đối số? Một bài kiểm tra đơn vị cần phải là một bài kiểm tra tự chứa mà thiết lập một môi trường với dữ liệu, thực hiện các hành động cần thiết, và sau đó khẳng định rằng kết quả là những gì được mong đợi. Bài kiểm tra của bạn không tự chứa vì nó dựa trên các giá trị bên ngoài cho number1number2. Hãy thử như sau:

[Fact] 
private void TestAdd() { 
    //arrange 
    int number1 = 10; 
    string number2 = "10"; 

    //act 
    object result = Add(number1,number2); 

    //assert 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

private object Add(int number1, string number2) 
{ 
    return number1 + Convert.ToInt32(number2); 
} 

Something cần lưu ý, những gì bạn đang cố gắng làm (kiểm tra đơn vị tham số) có thể với các công cụ Pex

+0

Cảm ơn bạn. Nhưng ngày nay nhiều ứng dụng tương tác với người dùng cuối. Ví dụ, công việc của tôi chủ yếu là làm việc trong hệ thống tài khoản, hệ thống kiểm kê. Tôi không thể giả định dữ liệu đầu vào của người dùng. Tôi mới trong đó, vẫn đang tìm giá trị của bài kiểm tra đơn vị. – Cheung

+2

Chức năng của bạn phải chấp nhận một số phạm vi dữ liệu nhất định. Thông thường bạn sẽ kiểm tra ouliers của phạm vi đó, các trường hợp đặc biệt, và sau đó một cái gì đó trong phạm vi (cho sanity). Nhưng hãy kiểm tra Pex, nó sẽ tạo ra dữ liệu đầu vào cho bạn để kiểm tra chức năng của bạn – flipchart

+0

Cảm ơn bạn, có vẻ như Pex là những gì tôi muốn. – Cheung

14

Giới thiệu về giá trị ngẫu nhiên và phương pháp/biến nội tuyến trong thử nghiệm. Mã này tạo ra 100 cặp int/string ngẫu nhiên cho thử nghiệm của bạn.

[Theory] 
    [PropertyData("GetTestData")] 
    public void test(int number1, string number2) 
    { 

     int result = number1 + Convert.ToInt32(number2); 
     var expectedType = Type.GetType("System.Int32"); 
     Assert.IsType(expectedType, result); 
    } 

    public static IEnumerable<object[]> GetTestData 
    { 
     get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); } 
    } 

    private static object[] GenerateTestData() 
    { 
     var rand = new Random(0); 
     return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()}; 
    } 
+0

Cảm ơn bạn rất nhiều! – Cheung

+0

Bạn được chào đón. – Alina

+0

Nhưng tại sao? Nếu nó không thành công, bạn không thể tái tạo nó. Tạo tập hợp của bạn với các giá trị ngẫu nhiên sau khi sửa chúng trong thử nghiệm của bạn. –

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