【问题标题】:NUnit TestCaseSource with parameters?NUnit TestCaseSource 带参数?
【发布时间】:2015-02-03 19:30:38
【问题描述】:

我有多个实现空接口的测试类(ITest,扩展为IEnumerable)。

界面:

public interface ITest : IEnumerable
{
}

带有描述的TestDataSource:

[Description("TestSourceName")]
public class MyTests : ITest
{    
    public IEnumerator GetEnumerator()
    {
        yield return "123";
        yield return "456";
    }
}

TestDataProvider 类将在 NUnit 中用作 TestDataSource, 我正在使用反射来获得正确的TestDataSource 对象:

public class TestDataProvider : IEnumerable
{
    public string Name { get; set; }
    public IEnumerator GetEnumerator()
    {

        if (string.IsNullOrEmpty(Name))
            yield break;

        var testdata = System.Reflection.Assembly.GetExecutingAssembly()
                .GetTypes()
                .Where(mytype => mytype.GetInterfaces().Contains(typeof(ITest)))
                .Where(mytype => ((DescriptionAttribute)mytype.GetCustomAttributes(typeof(DescriptionAttribute), false)[0])
                .Description.ToLower() == Name.ToLower());

        yield return ((IEnumerable)testdata).GetEnumerator();

    }

        public IEnumerator GetEnumerator(string name)
        {
            Name = name;
            return GetEnumerator();
        }
    }

现在我想知道如何将 TestSourceName 传递给 NUnit 的 TestDataSource

[TestCaseSource(typeof(TestDataProvider)), TestCaseSourceAttribute("TestSourceName")]
public void TestTestDataProvider()
{
    // here we will have the TestDataSource object given by TestDataProvider 
    // using parameter/attribute? "TestSourceName"
}

【问题讨论】:

标签: c# tdd nunit


【解决方案1】:

您可以采取的一种方法是使用 NUnit TheoryAttribute。理论仍然是即将发布的 3.0 版本的一部分。

大致基于您提供的示例,这是一个基于理论的有效测试示例,它使用来自DataPointsAttribute 的数据作为测试方法的参数。

[Description("TestSource2")]
public class TestData1 : ITest
{
    public IEnumerator GetEnumerator()
    {
        yield return "123";
        yield return "456";
    }
}

[Description("TestSource1")]
public class TestData2 : ITest
{
    public IEnumerator GetEnumerator()
    {
        yield return 33;
        yield return 44;
    }
}

public class TestDataProviderFixture
{
    [Datapoints] 
    public string[] SourceNames = {"TestSource1", "TestSource2"};

    [Theory]
    public void TestTestDataProvider(string sourceName)
    {
        var provider = new TestDataProvider();
        var data = provider.GetEnumerator(sourceName);

        if (sourceName == "TestSource1")
        {
            while (data.MoveNext())
            {
                //Do Stuff
            }
        }
        else if (sourceName == "TestSource2")
        {
            while (data.MoveNext())
            {
            //Do Stuff
            }
        }
        else
        {
            Assert.Fail();
        }
    }
}

【讨论】:

  • 坦克 BgRVa,我试试 3.0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多