我正在使用TestCaseSource属性。一个问题:当sourceName字符串无效时,测试只会被忽略而不是失败。如果重命名源方法,sourceName字符串没有更新,那么这将非常糟糕,然后您将失去测试提供的覆盖范围。有没有办法改变NUnit的行为,如果sourceName无效,测试会失败?
答案 0 :(得分:7)
这在NUnit 2.6.2中已得到解决。该属性有一个新的构造函数,它带有Type
(必须实现IEnumerable
);它“建议优先使用其他表单,因为它不使用字符串来指定数据源,因此更容易重构。” (来自documentation。)
这确实需要您的测试运行器支持最新的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));
}
}
答案 1 :(得分:3)
我看过它在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团队联系,或者只是以与失败测试相同的方式处理被忽略的测试:)
答案 2 :(得分:2)
如何使用C#6中引入的 nameof 功能
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(...)
{
}
}