2017-02-22 1 views
0

Probleme beim Ausführen meiner Testsuite (mit ReSharper), es sieht so aus, als ob statische Ergebnismenge zusammenstoßen, wenn mehrere Testklassen zusammen laufen, kein Problem für eine separate Lauf. die Struktur im Wesentlichen ähnelt dies:"Gemeinsame" Test-Setup (ClassInitialize) in MSTest mit Basisklasse Vererbung

public class TestBase 
{ 
    protected static Sum Target; 

    protected static void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

[TestClass] 
public class TestClass1 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(1, 2); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(3, Target.Result); 
    }  
    ... // plus around 20 tests 
} 

[TestClass] 
public class TestClass2 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(3, 4); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(7, Target.Result); // failed. Expected:<7>. Actual:<3> 
    } 
    ... // plus around 20 tests 
} 

Ich verstehe diese auf meine schlechte Verwendung von statischen Variablen zurückzuführen ist und gute Vorschläge auf appreciator würde, wie dies besser zu strukturieren, vorausgesetzt, ich rund 20 Unit-Tests haben in Jede Testklasse und jeder Testaufbau ist viel komplizierter als die obige Abbildung.

+1

Sie verstehen, dass das Problem auf schlechte Verwendung/Design mit statischen Variablen zurückzuführen ist, aber nicht bereit sind, das Problem zu beheben, und stattdessen möchten wir einen Weg finden, um die Symptome zu umgehen. Es kann nicht viel anderes vorgeschlagen werden. Das ist die Natur von OOP und statischen Variablen. – Nkosi

+0

danke für deinen Kommentar. eigentlich hatte ich auf einen Workaround gehofft, ähnlich zu NUnits nicht-statischem 'OneTimeSetUp' – Tsar

+0

Das ist was" TestInitialize "Attribut ist das Äquivalent von! – toadflakz

Antwort

1

Sie könnten dies leicht lösen, indem Sie static entfernen und ClassInitialize zu TestInitialize ändern.

public class TestBase 
{ 
    protected Sum Target; 

    protected void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

static Entfernen macht das Target Feld lokal zu den Test1 und Test2 Klassendefinitionen. Das Ändern von ClassInitialize in TestInitialize bedeutet, dass der Wert Target aktualisiert wird, bevor jede TestMethod ausgeführt wird und nicht, wenn die Klasse zum ersten Mal instanziiert wird.

+0

sorry, nicht durchführbar. siehe Bearbeiten – Tsar

Verwandte Themen