2011-11-17 111 views
9

我正在學習使用單元測試,我創建了一個項目,添加了xunit參考。 而以下代碼:爲什麼xunit不允許測試帶參數的方法?

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) 
     { 

     } 
    } 
} 

當我使用的xUnit GUI工具運行測試,它表示:

UnitTestProject.Form1.test信息:System.InvalidOperationException:事實 方法UnitTestProject.Form1.test不能有參數堆棧跟蹤: 於Xunit.Sdk.FactCommand.Execute(對象識別TestClass)
Xunit.Sdk.FixtureCommand.Execute(對象識別TestClass)
Xunit.Sdk.BeforeAfterCommand.Execute(對象識別TestClass)
Xunit.Sdk.LifetimeCommand.Execute(對象識別TestClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(對象識別TestClass)

那麼,怎樣才能我測試用的參數的方法/功能?

回答

18

你也可以使用[Theory]而不是[Fact]。它將允許您創建具有不同參數的測試方法。 例如

[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.使用xUnit,公開測試方法會更好。

+0

謝謝,但我可以將InlineData設置爲隨機值嗎?或者更好地說,InlineData接受內聯方法/變量? – Cheung

+0

你可以爲什麼不。看到下面的一個髒例子。 – Alina

+1

@Shiba一般你不應該在測試中使用隨機值。在您的示例方法中,如果一個隨機數字失敗,您將不知道導致問題的數字是什麼。儘量使測試具有確定性,並提供一系列預期的,意外的和極端的輸入。 – DaveShaw

2

xunit如何知道要爲參數提供什麼值?單元測試需要是一個自包含的測試,它用數據設置環境,執行所需的操作,然後聲明結果是預期的。您的測試不是獨立存在的,因爲它依賴number1number2的外部值。請嘗試以下操作:

[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); 
} 

一些需要注意的,你正在嘗試做的(參數化單元測試)是可能的Pex工具

+0

謝謝你。但是今天許多應用程序都與最終用戶交互。例如,我的工作大部分就像賬戶系統,庫存系統中的工作。我不能假設用戶的輸入數據。我是新手,仍然發現單元測試的價值。 – Cheung

+2

您的功能應該接受某些數據範圍。通常情況下,你會測試該範圍的外圍,例外情況,然後測試範圍內的內容(爲了理智)。但檢查一下Pex,它會生成輸入數據給你測試你的功能 – flipchart

+0

謝謝你,看來Pex就是我想要的。 – Cheung

14

關於測試中的隨機值和內聯方法/變量。 此代碼爲您的測試生成100個隨機的int /字符串對。

[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

非常感謝! – Cheung

+0

不客氣。 – Alina

+0

但是爲什麼?如果失敗,則無法重現。在測試中修復它們後,用隨機值生成您的設置。 –

相關問題