Подтвердить что ты не робот

NUnit TestCaseSource

Я использую атрибут TestCaseSource. Одна из проблем: когда строка sourceName недействительна, тест просто игнорируется вместо отказа. Это было бы очень плохо, если исходный метод переименовывается, строка sourceName не обновляется, а затем вы теряете охват, предоставленный тестом. Есть ли способ изменить поведение NUnit, чтобы тест завершился с ошибкой, если sourceName недействителен?

4b9b3361

Ответ 1

Это разрешено в NUnit 2.6.2. Существует новый конструктор для атрибута, который принимает Type (который должен реализовывать IEnumerable); он "рекомендуется для использования в предпочтении другим формам, потому что он не использует строку для указания источника данных и поэтому более легко реорганизуется". (Из документации.)

Это требует, чтобы ваш тестовый бегун поддерживал последнюю версию NUnit.

Самый простой пример (см. выше ссылку на документацию):

public class TestDataProvider : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        return new List<int>{ 2, 4, 6 }.GetEnumerator();
    }
}

[TestFixture]
public class MyTests
{
    [TestCaseSource(typeof(TestDataProvider))]
    public void TestOne(int number)
    {
        Assert.That(number % 2, Is.EqualTo(0));
    }
}

Ответ 2

Я посмотрел, как он работает внутри NUnit. Они просто генерируют исключение, если конкретный источник не существует:

MemberInfo[] members = providerType.GetMember(
 providerName,
 MemberTypes.Field | MemberTypes.Method | MemberTypes.Property,
 BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

if (members.Length == 0)
 throw new Exception(string.Format(
  "Unable to locate {0}.{1}", providerType.FullName, providerName));

Позже они поймают его и помечают особый ParameterSet (класс, который обертывает источник тестового случая) как RunState.NotRunnable, который позже будет обработан как Игнорируемый тест.

Таким образом, вероятно, нет способа изменить это поведение, не изменяя код NUnit, который является btw доступным для загрузки. Вы также можете попытаться связаться с командой NUnit или просто обработать проигнорированный тест так же, как и неудачные:)

Ответ 3

Как использовать функцию nameof, введенную в С# 6

public static class TestCasesData 
{ 
  public static string[] TestStringsData() 
  {
       return new string[] {"TEST1", "TEST2"};
  }
}

[TestFixture]
public class MyTest
{
     [Test]
     [TestCaseSource(typeof(TestCasesData), nameof(TestCasesData.TestStringsData))]
     public void TestCase1(...)
     {
     }
}