2009-04-29 44 views
11

参数测试在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)); 
} 

或类似的东西。

回答

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

创建一个私有方法和调用:

[Test] 
    public void TypeATest() 
    { 
     MyTest<TypeA>(); 
    } 

    [Test] 
    public void TypeBTest() 
    { 
     MyTest<TypeB>(); 
    } 

    private void MyTest<T>() 
    { 
     // do test. 
    } 
+0

我使用这种方法为我测试看起来像这样:[TestCase(new float [] {1,2,3,4,5},new float [] {1,2,3,4,5},true)] public void AbleToCompareEqualArrays(T [ ] ar1,T [] ar2,bool expectedValue) – 2011-08-15 22:38:12

3

您可以自定义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); 
    } 
} 
+1

谢谢你,我一直在努力奋斗几天如何做到这一点很好,你的回答帮助我终于做到了! – AzP 2017-08-04 15:58:15