NUnit TestCaseSource

我正在使用TestCaseSource属性。 一个问题:当sourceName字符串无效时,测试只会被忽略而不是失败。 如果重命名源方法,sourceName字符串没有更新,那么这将非常糟糕,然后您将失去测试提供的覆盖范围。 有没有办法改变NUnit的行为,如果sourceName无效,测试失败?

这在NUnit 2.6.2中得到了解决。 属性的新构造函数接受Type (必须实现IEnumerable ); 它“建议优先使用其他forms,因为它不使用字符串来指定数据源,因此更容易重构。” (来自文档 。)

这确实需要您的测试运行器支持最新的NUnit。

一个非常基本的示例(有关详细信息,请参阅上面的文档链接):

 public class TestDataProvider : IEnumerable { public IEnumerator GetEnumerator() { return new List{ 2, 4, 6 }.GetEnumerator(); } } [TestFixture] public class MyTests { [TestCaseSource(typeof(TestDataProvider))] public void TestOne(int number) { Assert.That(number % 2, Is.EqualTo(0)); } } 

我看看它在NUnit内部是如何工作的。 如果特定源不存在,它们只会抛出exception:

 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 ,稍后将其作为Ignored test处理。

所以,如果不改变NUnit代码,可能无法改变这种行为 – 这是可以下载的btw。 您也可以尝试与NUnit团队联系,或者只是以与失败测试相同的方式处理被忽略的测试:)

如何使用C#6中引入的nameoffunction

 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(...) { } }