带参数的 NUnit TestCaseSource?
NUnit TestCaseSource with parameters?
我有多个实现空接口的测试 classes(ITest
,用 IEnumerable
扩展)。
接口:
public interface ITest : IEnumerable
{
}
带有描述的测试数据源:
[Description("TestSourceName")]
public class MyTests : ITest
{
public IEnumerator GetEnumerator()
{
yield return "123";
yield return "456";
}
}
TestDataProvider
class 将在 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"
}
您可以采用的一种方法是使用 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();
}
}
}
我有多个实现空接口的测试 classes(ITest
,用 IEnumerable
扩展)。
接口:
public interface ITest : IEnumerable
{
}
带有描述的测试数据源:
[Description("TestSourceName")]
public class MyTests : ITest
{
public IEnumerator GetEnumerator()
{
yield return "123";
yield return "456";
}
}
TestDataProvider
class 将在 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"
}
您可以采用的一种方法是使用 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();
}
}
}