带有参数的NUnit TestCaseSource?

时间:2015-02-03 19:30:38

标签: c# tdd nunit

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

接口:

public interface ITest : IEnumerable
{
}

带有描述的TestDataSource:

[Description("TestSourceName")]
public class MyTests : ITest
{    
    public IEnumerator GetEnumerator()
    {
        yield return "123";
        yield return "456";
    }
}
在NUnit中将用作TestDataProvider

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"
}

1 个答案:

答案 0 :(得分: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();
        }
    }
}