在NUnit 2.5中,你可以这样做:
[TestCase(1,5,7)]
public void TestRowTest(int i, int j, int k)
{
Assert.AreEqual(13, i+j+k);
}
您可以进行参数测试。
但是我想知道你是否可以这样做,使用通用测试方法进行参数测试?即:
[TestCase <int>("Message")]
public void TestRowTestGeneric<T>(string msg)
{
Assert.AreEqual(5, ConvertStrToGenericParameter<T>(msg));
}
或类似的东西。
答案 0 :(得分:22)
以下是NUnit 2.5 link text
的发行说明中的引用参数化测试方法可能是 通用的。 NUnit将推断出正确的 基于实现使用 提供的参数类型。 支持通用测试方法 通用和非通用条款。
根据这一点,可以在非泛型类中使用通用测试方法。怎么样?
我不太了解杰夫的评论。在.net泛型中是编译时和运行时。我们可以使用反射来找出与方法关联的测试用例属性,找出泛型参数,并再次使用反射来调用泛型方法。它会起作用,不是吗?
更新:好的,我现在知道怎么做,希望还为时不晚。您需要将泛型类型放在参数列表中。例如:
[TestCase((int)5, "5")]
[TestCase((double)2.3, "2.3")]
public void TestRowTestGeneric<T>(T value, string msg)
{
Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg));
}
答案 1 :(得分:4)
您可以制作自定义GenericTestCaseAttribute
[Test]
[GenericTestCase(typeof(MyClass) ,"Some response", TestName = "Test1")]
[GenericTestCase(typeof(MyClass1) ,"Some response", TestName = "Test2")]
public void MapWithInitTest<T>(string expectedResponse)
{
// Arrange
// Act
var response = MyClassUnderTest.MyMethod<T>();
// Assert
Assert.AreEqual(expectedResponse, response);
}
这是GenericTestCaseAttribute
的实现[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class GenericTestCaseAttribute : TestCaseAttribute, ITestBuilder
{
private readonly Type _type;
public GenericTestCaseAttribute(Type type, params object[] arguments) : base(arguments)
{
_type = type;
}
IEnumerable<TestMethod> ITestBuilder.BuildFrom(IMethodInfo method, Test suite)
{
if (method.IsGenericMethodDefinition && _type != null)
{
var gm = method.MakeGenericMethod(_type);
return BuildFrom(gm, suite);
}
return BuildFrom(method, suite);
}
}
答案 2 :(得分:1)
创建一个私有方法并调用:
[Test]
public void TypeATest()
{
MyTest<TypeA>();
}
[Test]
public void TypeBTest()
{
MyTest<TypeB>();
}
private void MyTest<T>()
{
// do test.
}