为什么xunit不允许测试带参数的方法?

时间:2011-11-17 06:31:12

标签: 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不能有参数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)

那么,我如何用参数测试方法/函数?

3 个答案:

答案 0 :(得分:21)

此外,您可以使用[Theory]代替[Fact]。它允许您使用不同的参数创建测试方法。 E.g。

[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,最好将测试方法公之于众。

答案 1 :(得分:14)

关于测试中的随机值和内联方法/变量。 此代码为您的测试生成100个随机的int / string对。

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

答案 2 :(得分: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工具

可以实现您的目标(参数化单元测试)