Я использую атрибут TestCaseSource. Одна из проблем: когда строка sourceName недействительна, тест просто игнорируется вместо отказа. Это было бы очень плохо, если исходный метод переименовывается, строка sourceName не обновляется, а затем вы теряете охват, предоставленный тестом. Есть ли способ изменить поведение NUnit, чтобы тест завершился с ошибкой, если sourceName недействителен?
NUnit TestCaseSource
Ответ 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(...)
{
}
}