簡體   English   中英

如何為具有多個狀態的Singleton對象運行測試用例?

[英]How to run test cases for Singleton object with multiple state?

我在C#中有一個單例對象。

該單例對象根據分配給它的某些狀態工作。

我沒有任何方法在運行時切換單例對象的狀態。 我也不需要它,因為應用程序始終以一種狀態啟動並保持相同狀態。

問題在於編寫測試用例時。 我已經為每種狀態編寫了測試用例。 但是我無法運行它,因為對於所有測試用例,我都具有一個狀態的單個對象。

如何針對其他狀態運行測試。 如何為每個測試重新創建對象?

我不想更改測試用例的單例對象代碼。

任何想法或想法將不勝感激。

這就是為什么不方便自己管理類的生存期,而是讓諸如AutofacUnity這樣的控制反轉(IoC)容器為您做到這一點的原因之一。 然后,您只需創建一個類似於其他任何類的類,並告訴您的IoC容器將其作為單例實例化。

另請參見Autofac生命周期入門

在無法使用IoC容器的情況下(想不出什么,但是要靈活一點),您可以創建一個包含“單例”邏輯的internal類,而這個內部類就是這樣,內部類,不是單身...

internal class MyLogic
{
   ...
}

然后,將其包裝在一個公共類中,並使其成為單例。 如果將這兩個類都放在一個項目中,則內部類(業務邏輯的實現)將無法被應用程序訪問,只能訪問公共單例版本。

public sealed class MySingleton 
{
    private MySingleton() { Implementation = new MyLogic(); }

    public static MySingleton Instance { ... }

    private MyLogic Implementation { get; set; }

    ...
}

但是,然后您可以在AssemblyInfo指出,通過使用以下命令,您的單元測試項目確實可以訪問內部類

[assembly: InternalsVisibleTo("MySolution.UnitTests")]

這樣,您可以對邏輯類進行單元測試,而您的應用程序只能將其用作Singleton。

坦率地說,我更喜歡使用IoC方式,但是如果您不熟悉IoC方式,則可以更快地實施上述解決方案。

祝好運!

我不想更改測試用例的單例對象代碼。

也許是時候考慮為整個程序進行更改了。 是否有你需要這是單身的一個原因? 如果您需要 ,Singleton是一個很好的模式,但是它經常被想要使用全局變量但聽說過它們是邪惡的人濫用。 現在,他們對單例進行編程,因為它們是很酷的OOP的“模式”之一,它們的工作原理相同。

但是單身人士不過是一個整體。 它具有與全球相同的問題。 如果使用該模式,請確保確實需要它,因為它附帶有問題,因此需要權衡利弊。 如果您不使用收益,那么您只會有弊端。

我建議您在可能的情況下避免單例,請參閱Misko Hevery的演講: Clean Code Talks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM