Unit Tests (MS Test). Проблема в построении DataRow

Есть метод с такой сигнатурой: public static uint GCDByEuclid(uint num1, uint num2, out TimeSpan time)

Для него нужно написать тест. В предыдущем вопросе узнал, что это нужно делать через атрибут DataRow. Но теперь не понимаю как можно вставить, к примеру, TimeSpan в DataRow.

Моя попытка это сделать:

[DataTestMethod]
[DataRow(10u, 50u, new TimeSpan(), 10u)]
[DataRow(20u, 21u, new TimeSpan(), 1u)]
[DataRow(1500u, 3000u, new TimeSpan(), 1500u)]
[DataRow(22u, 15u, new TimeSpan(), 1u)]
public void GCDByEuclidWithTimeTest(uint num1, uint num2, TimeSpan time, uint expected)
{
    Assert.AreEqual(expected, FindGCD.GCDByEuclid(num1, num2, out time));
}

Ответы (2 шт):

Автор решения: The Konstantin

Благодаря более внимательному изучению примеров, предложенных к ознакомлению Alexander Petrov в предыдущем вопросе, написал следующее:

[DataTestMethod]
[DynamicData(nameof(GetDataForGCDByEuclidWithTimeTest), DynamicDataSourceType.Method)]
public void GCDByEuclidWithTimeTest(uint num1, uint num2, TimeSpan time, uint expected)
{
    Assert.AreEqual(expected, FindGCD.GCDByEuclid(num1, num2, out time));
}

private static IEnumerable<object[]> GetDataForGCDByEuclidWithTimeTest()
{
    yield return new object[] { 10u, 50u, new TimeSpan(), 10u };
    yield return new object[] { 20u, 21u, new TimeSpan(), 1u };
    yield return new object[] { 1500u, 3000u, new TimeSpan(), 1500u };
    yield return new object[] { 22u, 15u, new TimeSpan(), 1u };
}

Все отработало корректно. Правда не уверен на счет корректности тестирования таким образом(я никак не проверю TimeSpan, который, может, и не нужно првоерять).

→ Ссылка
Автор решения: Alexander Petrov

В тестовый метод в виде параметров должны передаваться только входные значения. А так как параметр с модификатором out выходной, то его следует убрать.
Получается следующее:

[DataTestMethod]
[DynamicData(nameof(GetDataForGCDByEuclidWithTimeTest), DynamicDataSourceType.Method)]
public void GCDByEuclidWithTimeTest(uint num1, uint num2, uint expected)
{
    TimeSpan time;
    Assert.AreEqual(expected, FindGCD.GCDByEuclid(num1, num2, out time));
}

private static IEnumerable<object[]> GetDataForGCDByEuclidWithTimeTest()
{
    yield return new object[] { 10u, 50u, 10u };
    yield return new object[] { 20u, 21u, 1u };
    yield return new object[] { 1500u, 3000u, 1500u };
    yield return new object[] { 22u, 15u, 1u };
}

И в зависимости от типа теста, может понадобиться проверять и параметр с out:

[DataTestMethod]
[DynamicData(nameof(GetDataForGCDByEuclidWithTimeTest), DynamicDataSourceType.Method)]
public void GCDByEuclidWithTimeTest(uint num1, uint num2, uint expected)
{
    TimeSpan time;
    uint actual = FindGCD.GCDByEuclid(num1, num2, out time);
    
    Assert.AreEqual(expected, actual);
    Assert.IsTrue(time < TimeSpan.FromSeconds(5));
}
→ Ссылка