Xunit.Net пропускает тесты из-за дубликата ID - PullRequest
1 голос
/ 08 марта 2019

В этом ответе 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(), которое будет меняться.

1 Ответ

2 голосов
/ 09 марта 2019

Нет отклонений от входных данных теста.Ваш атрибут возвращает пустой массив объектов, а ваша теория не имеет параметров, поэтому вы в основном пытаетесь запускать один и тот же тест снова и снова.Таким образом, он пропускается после первого выполнения.

Если входные данные ваших тестов

, определенные внешними данными

, тогда что вы можетехочу попробовать - пусть ваш DataAttribute читает внешний источник данных и выдает результаты из него.Затем вы можете получить эти данные в качестве параметров вашего [Theory] метода.

Вы можете увидеть пример использования файла JSON в качестве внешнего источника данных для тестовых теорий в блоге Эндрю Лока здесь .

...