В этом ответе SO показан код, который должен привести к многократному выполнению теста теории Xunit с применением этого атрибута метода:
[Theory]
[Repeat(3)]
public void MyTest()
{
// test code here
}
Атрибут Repeat()
определяется как:
public class RepeatAttribute : DataAttribute
{
private readonly int _count;
public RepeatAttribute(int count)
{
if (count < 1)
{
throw new ArgumentOutOfRangeException(nameof(count), "Repeat count must be greater than 0.");
}
_count = count;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
return Enumerable.Repeat(new object[0], _count);
}
}
Вариант использования для этого - заставить Xunit запускать теорию тестирования несколько раз, пока данные не будут исчерпаны.Например, когда выполняемые тесты определяются извлеченными извне данными, а не специально закодированным числом методов.
К сожалению, это приводит к ошибке:
[xUnit.net 00:00:00.55] Basic: Skipping test case with duplicate ID '071bf13109c976bcd6c61a7afa145a7a1cdb8e0a' ('Basic.Tests.MyTest()' and 'Basic.Tests.MyTest()')
[xUnit.net 00:00:00.55] Basic: Skipping test case with duplicate ID '071bf13109c976bcd6c61a7afa145a7a1cdb8e0a' ('Basic.Tests.MyTest()' and 'Basic.Tests.MyTest()')
Есть лиспособ обойти это?
Я попытался переопределить свойство Skip
, но либо не смог найти правильное значение для его возврата, либо он не дал желаемого эффекта.
[EDIT] В ответ на принятый ответ @peterszabo мой код теперь выглядит следующим образом:
public class RepeatAttribute : DataAttribute
{
private readonly int _count;
public RepeatAttribute(int count)
{
if (count < 1)
{
throw new ArgumentOutOfRangeException(nameof(count), "Repeat count must be greater than 0.");
}
_count = count;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
var list = new List<object[]>();
for (var i=1; i<=10; i++)
list.Add(new object[] {i});
return list as IEnumerable<object[]>;
}
}
Это содержимое object[]
в каждом list.Add()
, которое будет меняться.