2016-11-29 25 views
0

我正在使用Nunit,我不知道是否有辦法返回到真正的初始化狀態,包括所有已經構建的單例。如何返回到幾個測試執行之間的系統初始狀態

目前我已經解決了它與一個解決方法添加到單身重置方法,我不喜歡它,因爲現在我的生產代碼不乾淨。

據我所知,單音將被初始化一次並保存在所有測試執行期間可用的堆中。

有沒有辦法在Nunit testfixture的拆解函數中清理堆?

我已經成功地再現與以下(醜陋的)的代碼示例的問題,你可以看到,當兩個測試執行一前一後的第二個失敗...

[TestFixture] 
public class SingletonCleanups 
{ 
    private MySingleTonsHolder _holder; 
    [SetUp] 
    public void Setup() 
    { 
     _holder = new MySingleTonsHolder(); 
    } 
    [Test] 
    public void DoWork_FirstExecution_SingleCalledOnce() 
    { 
     _holder.DoWork(); 
     Assert.AreEqual(1, MySingleTonsHolder.MySingleTon.CalledCount); 
    } 
    [Test] 
    public void DoWork_SecondExecution_SingleCalledOnce() 
    { 
     _holder.DoWork(); 
     Assert.AreEqual(1, MySingleTonsHolder.MySingleTon.CalledCount); 
    } 
} 

public class MySingleTonsHolder 
{ 
    public static MySingleTon MySingleTon => MySingleTon.Instance(); 

    public void DoWork() 
    { 
     MySingleTon.Instance().CalledCount++; 
    } 
} 

public class MySingleTon 
{ 
    private static MySingleTon _instance; 
    public static MySingleTon Instance() 
    { 
     if (_instance==null) 
     { 
      _instance = new MySingleTon(); 
     } 
     return _instance; 
    } 
    public int CalledCount { get; set; } 
    private MySingleTon() 
    { 
     CalledCount = 0; 
    } 
} 
+0

到anwser是否有可能提供樣品測試類進行了再現的問題?很難說明您正在嘗試做什麼 – nozzleman

+0

是否可以重新啓動測試中的程序或重新初始化整個組件? 關於在單元測試中使用單例發生的問題的討論可以在這裏找到:http://stackoverflow.com/questions/3876951/why-is-it-hard-to-unit-test-a-system-that -depends-on-singletons – JoeFox

回答

-1

的東西在這裏單元測試向你展示了非常有用的東西:代碼中的static字段是EVIL。 now my production code is not clean =>由於靜態,它不乾淨。 如果您想要介紹singletone,請使用您使用的DI框架,或者不使用DI框架,而使用IoC。

欲瞭解更多信息,請何去何從Dependency Injection & Singleton Design pattern

+0

你是對的靜態字段和單例是EVIL,說我認爲DI框架不會解決這個問題,因爲單體對象將保持在測試之間... – silver

+0

@silver是,如果你在靜態領域保持某種東西,DI不會對你有所幫助。 – tym32167

+0

所以它不回答我的問題:( – silver

相關問題