簡體   English   中英

NUnit TestCaseSource有參數嗎?

[英]NUnit TestCaseSource with parameters?

我有多個實現空接口的測試類( ITest ,使用IEnumerable擴展)。

接口:

public interface ITest : IEnumerable
{
}

TestDataSource的描述:

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

將在NUnit中用作TestDataSource TestDataProvider類,我正在使用反射來獲取正確的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"
}

您可以采用的一種方法是使用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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM