Как предоставить значения int [,] и int для метода тестирования, C# - PullRequest
1 голос
/ 27 января 2020

Мне нужен этот метод для юнит-тестирования. Существует матрица и метод, который вычисляет матричный след, который является целым числом. Поэтому мне нужно предоставить простую матрицу (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 )
        };
    }

но ошибка «Не найден лучший тип для неявно типизированного массива», как, например, если я пытаюсь создать массив, но я просто соединяю два значения в скобках. Где я не прав?

1 Ответ

3 голосов
/ 27 января 2020

Ваш тип возвращаемого значения не соответствует данным метода, вы можете использовать tuple (int[,], int) в качестве универсального c параметра типа для IEnumerable<T> и yield return для возврата одного элемента.

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

    yield return (array2d, myInteger);
}

Обновление : только что посмотрел некоторые статьи, касающиеся MSTest и атрибута DynamicData, например this . Правильный подход, кажется, использует IEnumerable<object[]>, где каждый элемент в массиве объектов представляет один аргумент в методе теста

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

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