2016-05-22 19 views
0

Ich möchte alle Implementierungen einer Schnittstelle mit der gleichen Testklasse testen. Ich kenne bereits das TestCaseSourceAttribute, also habe ich es eingerichtet, um die Objektinstanzen aus dem statischen testObjects Array zu laden. Dieser Code funktioniert, wie ich will:NUnit: Wie man eine Testklasse für mehrere Objekte ausführt - bessere Alternative als TestCaseSourceAttribute?

[TestFixture] 
    public class MySerializerTests 
    { 
     // IStreamSerializers loaded by the TestCaseSource attribute. 
     static object[] testObjects = new object[] 
     { 
      new BinarySerializer(), 
      new XmlSerializer(), 
      new JsonSerializer() 
     }; 

     [Test, TestCaseSource("testObjects")] 
     public void Serialize_NullStreamArgument_ThrowsArgumentException(IStreamSerializer serializer) 
     { 
      Map map = new Map(); 
      Assert.Throws<ArgumentNullException>(() => serializer.Serialize(null, map)); 
     } 
    } 

However, I have to use *[TestCaseSource("testObjects")]* on every method, which makes it rather tedious for the amount of methods I have. Is there a way of replacing the *TextCaseSource* attribute with an attribute that works on the whole test class? Maybe similar to the way a parameterized *FestFixture* works? 

ich etwas ähnliches wie dies möchte, aber wo ich Instanzen meiner getesteten Klassen über den Konstruktor der Testklasse passieren kann:

[TestFixture(0)] 
    [TestFixture(1)] 
    [TestFixture(2)] 
    public class MySerializerTests 
    { 
     // IStreamSerializers loaded by the TestCaseSource attribute. 
     static object[] testObjects = new object[] 
     { 
     new BinarySerializer(), 
     new XmlSerializer(), 
     new JsonSerializer() 
     }; 

     int currentIndex; 

     public MySerializerTests(int index) 
     { 
      currentIndex = 0; 
     } 

     [Test] 
     public void Serialize_NullStreamArgument_ThrowsArgumentException() 
     { 
      Map map = new Map(); 
      Assert.Throws<ArgumentNullException>(() => testObjects[currentIndex].Serialize(null, map)); 
     } 
    } 
+0

Können Sie erklären, was Sie wollen? Die Instanzen werden in einem statischen Array gespeichert, sodass sie für alle Methoden, die sich auf dieses Array beziehen, freigegeben sind. – Charlie

+0

Ich fügte der Frage eine bessere Erklärung hinzu. Mein erstes Beispiel funktioniert bereits so, wie ich es möchte, aber ich suche nach einer Möglichkeit, das TestCaseSource-Attribut nicht bei jeder Methode verwenden zu müssen. Stattdessen möchte ich elegant alle benötigten Instanzen über eine parametrisierte TestFixture oder eine ähnliche Art erstellen. Es funktioniert perfekt mit Werttypen, aber ich kann keinen Konstruktoraufruf als Parameter übergeben. – Xarbrough

Antwort

0

Sie wollen das TestFixtureSourceAttribute.

[TestFixtureSource("testObjects")] 
public class MySerializerTests 
{ 
    // IStreamSerializers loaded by the TestCaseSource attribute. 
    static IStreamSerializer[] testObjects = new IStreamSerializer[] 
    { 
     new BinarySerializer(), 
     new XmlSerializer(), 
     new JsonSerializer() 
    }; 

    IStreamSerializer _serializer; 

    public MySerializerTests(IStreamSerializer serializer) 
    { 
     _serializer = serializer; 
    } 

    [Test] 
    public void Serialize_NullStreamArgument_ThrowsArgumentException() 
    { 
     Map map = new Map(); 
     Assert.Throws<ArgumentNullException>(
      () => _serializer.Serialize(null, map)); 
    } 
} 

Ich habe nicht erstellt, so dass Sie Fehler beheben können müssen, usw.

+0

Nach Überprüfung der Dokumentation sieht dies wie die perfekte Antwort aus. Schade, dass ich NUnit in Unity verwende, das das TestFixtureSource-Attribut derzeit nicht unterstützt; Aber das ist ein anderes Problem, also akzeptiere ich das als Antwort und werde schauen, ob ich meine Framework-Version aktualisieren kann. – Xarbrough