[英]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.