1

C# にシングルトン オブジェクトがあります。

このシングルトン オブジェクトは、割り当てられた状態に基づいて機能します。

実行時にシングルトン オブジェクトの状態を切り替える方法はありません。また、アプリケーションは常に 1 つの状態で開始され、同じ状態のままであるため、必要ありません。

問題は、テスト ケースの作成中です。各州のテストケースを書きました。しかし、すべてのテストケースで1つの状態を持つ単一のオブジェクトがあるため、実行できません。

他の状態のテストを実行する方法。各テストのオブジェクトを再作成する方法は?

テスト ケースのシングルトン オブジェクト コードを変更したくありません。

どんな考えやアイデアでも大歓迎です。

4

3 に答える 3

4

これが、クラスの有効期間を自分で管理するのではなく、 AutofacUnityなどの制御の反転 (IoC) コンテナーを使用すると便利な理由の 1 つです。次に、他のクラスと同じように見えるクラスを作成し、IoC コンテナーにそれをシングルトンとしてインスタンス化するように指示します。

Autofac Lifetime Primerも参照してください。

IoC コンテナーを使用できない場合 (何も考えられませんが、柔軟に対応しましょう)、internal「シングルトン」のロジックを含むクラスを作成できます。この内部クラスは、まさに内部クラスです。クラス、シングルトンではありません...

internal class MyLogic
{
   ...
}

そして、それを public クラスにラップして、それをシングルトンにします。これらの両方のクラスを 1 つのプロジェクトにまとめた場合、アプリケーションは内部クラス (ビジネス ロジックの実装) にアクセスできず、パブリック シングルトン バージョンのみにアクセスできます。

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

    public static MySingleton Instance { ... }

    private MyLogic Implementation { get; set; }

    ...
}

AssemblyInfoただし、ユニットテストプロジェクトが内部クラスにアクセスできることを指摘することができます

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

このようにして、アプリケーションがロジック クラスをシングルトンとしてしか使用できない場合でも、ロジック クラスを単体テストできます。

率直に言って、私は IoC の方法を好みますが、それが初めての場合は、代わりに上記のソリューションを実装する方がおそらく高速です。

幸運を!

于 2013-05-31T08:21:54.517 に答える
1

テスト ケースのシングルトン オブジェクト コードを変更したくありません。

プログラム全体の変更を検討する時期かもしれません。これをシングルトンにする必要がある理由はありますか? シングルトンは、必要な場合に最適なパターンですが、グローバル変数を使用したいが、それが悪だと聞いたことがある人によって誤用されることがよくあります。現在、シングルトンはクールな OOP である「パターン」の 1 つでありながら同じように機能するため、シングルトンをプログラムしています。

しかし、シングルトンはグローバルに他なりません。そして、グローバルと同じ問題があります。そのパターンを使用する場合は、実際にそれが必要であることを確認してください。これには問題が付随しており、利点と欠点を比較検討する必要があるためです。メリットを活かさないとデメリットしかない。

于 2013-05-31T08:28:49.853 に答える
0

可能であればシングルトンを避けることをお勧めします。Misko Hevery によるこのトークを参照してください: The Clean Code Talks

于 2013-05-31T08:25:15.473 に答える