2017-02-22 87 views
0

執行我的測試套件(使用ReSharper)時出現問題,看起來好像多個測試類一起運行時靜態結果集衝突,而不是單獨的問題跑。結構,在本質上是與此類似:使用基類繼承的MSTest中的「共享」測試設置(ClassInitialize)

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 
} 

我明白這是由於我的靜態變量的使用情況差,將欣賞者對如何構建這個更好什麼好的建議,假設我有大約20個單元測試每個測試類和測試設置都比上面的例子複雜得多。

+1

你明白這個問題是由於靜態變量的使用/設計較差,但不願意解決問題,而是希望我們想出解決症狀的方法。沒有其他建議。這是OOP和靜態變量的本質。 – Nkosi

+0

感謝您的評論。實際上我希望有一種解決方法,類似於NUnit的非靜態'OneTimeSetUp' – Tsar

+0

這就是'TestInitialize'屬性的等價物! – toadflakz

回答

1

您可以通過刪除static並將ClassInitialize更改爲TestInitialize來輕鬆解決此問題。

public class TestBase 
{ 
    protected Sum Target; 

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

刪除static使得Target場地方到的Test1和Test2的類定義。 將ClassInitialize更改爲TestInitialize意味着在運行每個TestMethod之前刷新值Target,而不是在首次實例化類時。

+0

抱歉,不可行。請參閱編輯 – Tsar