NUnit TestCaseSource

Dan*_*anB 22 c# nunit testcasesource

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

Tru*_*ill 7

这在NUnit 2.6.2中得到了解决.有一个属性的新构造函数,它采用a 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));
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 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));
Run Code Online (Sandbox Code Playgroud)

后来他们捕获它并标记特定的ParameterSet(包装测试用例源的类),RunState.NotRunnable稍后将其作为忽略的测试进行处理。

因此,在不更改 NUnit 代码的情况下可能无法更改此行为 - 顺便说一句,该代码可供下载。您还可以尝试与 NUnit 团队联系,或者以与失败测试相同的方式对待忽略的测试:)