2009-04-29 65 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