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 шт):
Благодаря более внимательному изучению примеров, предложенных к ознакомлению 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, который, может, и не нужно првоерять).
В тестовый метод в виде параметров должны передаваться только входные значения. А так как параметр с модификатором 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));
}