2015-11-20 12 views
5

単体テストで呼び出し可能なメソッドを記述することは可能ですか?私の問題は、私たちのフレームワークに多くのSingletonクラスが含まれていることです。ユニットテストはしばらく時間がかかります。単体テストで呼び出し可能なメソッドを作成する

public interface IUnitTestClearable 
{ 
    void ClearForUnitTest(); 
} 

この方法では、ユニットテストのより良いハンドリングのための「リセット」シングルトンインスタンスのために呼び出されます。私の考えでは、このような単純なインタフェースを作成することでした。しかし、このメソッドは、単体テストクラス/インスタンスからのみ呼び出すことができます。これは可能ですか?

+1

ちょうどプライベートメソッドは、同様に外部ソースから呼び出すことができることを覚えておいてください公共

private static void Main(string[] args) { var ms = new MySingleton(); ms.ClearForUnitTest(); } 

だろう。 –

答えて

8

を使用することです。この方法では、私はこれを終了して、あなたが別のアセンブリをあなたの内部

http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx

が、ティムへのアクセス権を与えるだけで私の前にいた:)

プロジェクトファイルには、AssemblyInfo.cs、

[assembly: InternalsVisibleTo("Application.Test")] 
を設定しました

またはあなたが署名したアセンブリを持っている場合

[assembly: InternalsVisibleTo("Application.Test, PublicKey=KEYHERE")] 
+0

まだ正解、私からの+1 :) –

5

ユニットテストへのアクセスを提供しながら、そのアクセスを使用する他のもの(ab)を制御または防止することは良い考えです。いくつかの方法がありますが、これは行うことができますが、最も簡単なのはあなたが方法は、内部およびセットInternalsVisibleTo作ることができますInternalsVisibleTo

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

1

混乱を招く可能性があるので、すべてのプライベートメソッドをユニットテストに公開したくないかもしれないので、シングルトンクラスのプライベートメソッドを追加してください。

public class MySingleton 
{ 
    private void ClearForUnitTest() 
    { 
     Console.WriteLine("Cleared."); 
    } 
} 

ユニットテストで使用する拡張子を作成します。

public static class PrivateExtensions 
{ 
    public static void ClearForUnitTest<T>(this T instance) 
    { 
     var method = typeof(T).GetMethod("ClearForUnitTest", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(instance, null); 
    } 
} 

それのように使用することは利益

+0

良い選択肢にも見えます。ありがとうございました! – BendEg

関連する問題