2011-11-17 112 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

但是为什么?如果失败,则无法重现。在测试中修复它们后,用随机值生成您的设置。 –

相关问题