Использование int?[] вместо object[] в атрибутах
Накидал вспомогательный код для того, чтобы проводить юнит-тестирование реализаций linked list:
[Test]
[TestCase(
new string[] { "MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get" },
new object[] { null, 1, 3, new int[] { 1, 2 }, 1, 1, 1 },
new object[] { null, null, null, null, 2, null, 3 }
)]
public void SinglyListNodeTests(string[] actionsNames, object[] actionsParams, object[] expectedOutput)
{
}
Однако немного некрасиво выглядит тип у expectedOutput: хотел заменить object[] на int?[], но столкнулся с тем, что такой код не хочет компилироваться, выдаёт ошибку
CS0182 An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
Как-то можно обойти это ограничение на атрибуты (возможно в новых версиях языка что-то есть подходящее) или это никак не объехать и только оставить как есть?
Ответы (1 шт):
Итого. В случае int?[] ещё можно выкрутится через object[] и в принципе, я оставил как есть код — атрибуты вполне нормально смотрятся.
А вот когда дошёл до двумерных массивов и jagged — там только через TestCaseSource работаю, как и советовал в комментариях @aepot:
[Test]
[TestCaseSource(nameof(TestCases))]
public void FindDiagonalOrder(int[][] nums, int[] expected)
{
var actual = new Solution().FindDiagonalOrder(nums);
Assert.That(actual, Is.EqualTo(expected));
}
private static IEnumerable<object[]> TestCases()
{
yield return new object[]
{
new int[][]
{
new int[]{ 1, 2, 3 },
new int[]{ 4, 5, 6 },
new int[]{ 7, 8, 9 },
},
new int[] {1,2,4,7,5,3,6,8,9 },
};
yield return new object[]
{
new int[][]
{
new int[] { 1, 2, 3, 4 },
new int[] { 5, 6, 7, 8 },
new int[] { 9, 10, 11, 12 },
},
new int[] { 1 ,2 ,5 ,9 ,6 ,3 ,4 ,7 ,10 ,11 ,8 ,12 },
};
}
Аналогичный ответ кстати уже когда-то давали в подобных случаях, см. ответ @default locale: Деньги в юнит-тестах: использование decimal в аттрибутах