NUnit TestCaseSource

时间:2012-07-30 13:47:53

标签: c# nunit testcasesource

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

3 个答案:

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