22

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

4

3 回答 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 回答