首页 > 解决方案 > 如何为测试方法提供 int[,] 和 int 值,C#

问题描述

我需要这种方法进行单元测试。有矩阵和计算矩阵迹的方法,它是整数。所以我需要提供简单的矩阵 (int[,]) 和预期的跟踪:

[DynamicData(nameof(TestDataMethod), DynamicDataSourceType.Method)]
public void TestReturnTrace(int[,] simpleMatrix, int expected)
{
    var mock = new Mock<IMatrixGenerator>();

    mock.Setup(a => a.GenerateRandomMatrix()).Returns(simpleMatrix);

    MatrixBase matrix = new MatrixBase(mock.Object);

    int actual = matrix.ReturnTrace();

    Assert.AreEqual(expected, actual);
}

如何创建简单的二维数组和整数值并返回它?

我最好的尝试是:

    static IEnumerable<object[], int> TestDataMethod()
    {
        int[,] array2d = new int[,] { { 1, 0 }, { 0, 1 } };
        int myInteger = 2;

        return (new[] { 
            new[] { array2d }, 
            myInteger )
        };
    }

但错误是“没有找到隐式类型数组的最佳类型”,就像我尝试创建数组一样,但我只是在括号中配对两个值。我哪里错了?

标签: c#.netunit-testingmstest

解决方案


您的返回类型与方法数据不匹配,您可以将其用作泛型类型参数并返回单个项目。tuple (int[,], int)IEnumerable<T>yield return

static IEnumerable<(int[,], int)> TestDataMethod()
{
    int[,] array2d = { { 1, 0 }, { 0, 1 } };
    int myInteger = 2;

    yield return (array2d, myInteger);
}

更新:刚刚看了一些关于 MSTest 和DynamicData属性的文章,就像这样。正确的方法似乎是使用IEnumerable<object[]>,其中对象数组中的每个项目都代表测试方法中的单个参数

static IEnumerable<object[]> TestDataMethod()
{
    int[,] array2d = { { 1, 0 }, { 0, 1 } };
    int myInteger = 2;

    yield return new object[] { array2d, myInteger };
}

推荐阅读