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.

War es hilfreich?

Lösung

Hier

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.
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top