Parametric Test mit generischen Methoden
-
03-07-2019 - |
Frage
In NUnit 2.5 Sie können dies tun:
[TestCase(1,5,7)]
public void TestRowTest(int i, int j, int k)
{
Assert.AreEqual(13, i+j+k);
}
Sie können Parametertest durchführen.
Aber ich frage mich, ob Sie diese oder nicht, parametrischen Test mit generischer Testmethode können tun? Das heißt:.
[TestCase <int>("Message")]
public void TestRowTestGeneric<T>(string msg)
{
Assert.AreEqual(5, ConvertStrToGenericParameter<T>(msg));
}
oder etwas ähnliches.
Lösung
ist das Zitat aus der Release-Info von NUnit 2.5 Link-Text
Parametrisierte Prüfverfahren können generisch. NUnit wird folgern die richtige Implementierung zu verwenden, um auf der Basis Arten der bereitgestellten Parameter. Generisches Testverfahren unterstützt in generisch und nicht generischer clases.
Nach diesem ist es möglich, generische Testverfahren in nicht-generische Klasse zu haben. Wie?
Ich verstehe nicht ganz Jeffs Kommentar. In .net Generika ist sowohl Kompilierung-und Laufzeit. Wir können die Reflexion verwenden, um das Testfall-Attribut, um herauszufinden, mit einem Verfahren verbunden ist, die generischen Parameter herausfinden und wieder Reflexion verwenden, um die generische Methode aufzuzurufen. Es wird funktionieren, oder?
Update: OK, ich weiß jetzt, wie und hoffen, dass es nicht zu spät ist. Sie müssen den generischen Typen in der Parameterliste sein. Zum Beispiel:
[TestCase((int)5, "5")]
[TestCase((double)2.3, "2.3")]
public void TestRowTestGeneric<T>(T value, string msg)
{
Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg));
}
Andere Tipps
Sie können benutzerdefinierte GenericTestCaseAttribute
machen [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);
}
Hier ist die Umsetzung von 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);
}
}
Erstellen Sie eine private Methode und nennen das:
[Test]
public void TypeATest()
{
MyTest<TypeA>();
}
[Test]
public void TypeBTest()
{
MyTest<TypeB>();
}
private void MyTest<T>()
{
// do test.
}