我有多个实现空接口的测试类(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"
}
答案 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();
}
}
}