循环遍历 memberdata 的 xunit 单元测试方法参数

Loop through xunit unit test method params for memberdata

我有这个方法可以使用 xUnit 进行测试

public class Cal
{       
        public int Output { get; set; }    

        public void Add(int num1, int num2) => Output = num1 + num2;
}

在我的单元测试 xUnit 中,我有

public class CalTest
{
        private readonly Cal _cal;

        public CalTest()
        {
            _cal = new Cal();
        }

        [Theory, MemberData(nameof(Data))] // Arrange
        public void CanAdd2Numbers(int expected, params int[] valuesToAdd)
        {
            // Act
            foreach (var value in valuesToAdd)
            {
                //_cal.Add(value[0], value[1]);
            }

            // Assert
            Assert.Equal(expected, _cal.Output);
        }

        public static IEnumerable<object[]> Data()
        {
            return new List<object[]>
            {
                new object[] { 1, 2, 3 },
                new object[] { -1, 1, 0 }
            };
        }
 }

如何将数组的第一个元素作为 num1 传递,第二个元素作为 num2 传递,第三个元素作为预期结果传递?而且我不想使用 InlineData.

您可以像这样将 MemberData 数组元素分配给测试方法参数:

public class Test
{
    [Theory]
    [MemberData(nameof(Data))]
    public void CanAdd2Numbers(int num1, int num2, int expected)
    {
        var actual = num1 + num2;
        Assert.Equal(expected, actual);
    }

    public static IEnumerable<object[]> Data()
    {
        return new List<object[]>
        {
            new object[] { 1, 2, 3 },
            new object[] { -1, 1, 0 }
        };
    }
}

您也可能喜欢此博客 post,了解如何将 TestData 转换为强类型:https://andrewlock.net/creating-strongly-typed-xunit-theory-test-data-with-theorydata/

您可以使用元组:

   public static IEnumerable<(int a, int b,int c)> Data()
    {
        return new List<(int a, int b,int c)>
        {
            (a:1,b:2,c:3),
            (a:1,b:-1,c:0)
        };
    }

然后你会像这样使用它

        _cal.Add(value.a, value.b);
        Assert.Equal(value.c, _cal.Output);