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

发布于 2024-12-16 10:57:13 字数 1029 浏览 0 评论 0原文

我正在学习使用单元测试,我创建一个项目,添加 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(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)

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

I am learning to use unit test, i create a project, add xunit reference.
And following codes:

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

        }
    }
}

When i run the test using xunit gui tool, it said:

UnitTestProject.Form1.test : System.InvalidOperationException : Fact
method UnitTestProject.Form1.test cannot have parameters 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)

So, how can i test the method/function with parameters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清醇 2024-12-23 10:57:13

您也可以使用[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);
}

ps 对于 xUnit,最好公开测试方法。

Also you can use [Theory] instead of [Fact]. It will allow you to create test methods with different parameters.
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. With xUnit it would be better to make test methods public.

半城柳色半声笛 2024-12-23 10:57:13

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

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

About random values and inline methods/variables in tests.
This code generates 100 random int/string pairs for your test.

    [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()};
    }
梦萦几度 2024-12-23 10:57:13

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 工具

How would xunit know what to supply as values for the arguments? A unit test needs to be a self contained test which sets up an environment with data, performs the required action, and then asserts that the results are what are expected. Your test is not self contained because it relies on external values for number1 and number2. Try the following:

[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 to note, what you are trying to do (parameterized unit testing) is possible with the Pex tool

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文