我正在使用 TestCaseSource 属性。一个问题:当 sourceName 字符串无效时,测试会被忽略而不是失败。如果源方法被重命名,sourceName 字符串没有得到更新,那么这将是非常糟糕的,然后你失去了测试提供的覆盖率。有没有办法改变 NUnit 的行为,以便在 sourceName 无效时测试失败?
问问题
8494 次
3 回答
7
这在 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));
}
}
于 2013-04-16T22:45:31.820 回答
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 代码的情况下可能无法更改此行为 - 顺便说一句,可以下载。您也可以尝试与 NUnit 团队联系,或者将忽略的测试与失败的测试相同:)
于 2013-04-09T22:21:54.797 回答
3
如何使用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(...)
{
}
}
于 2016-08-26T11:56:01.610 回答