2013-03-27 10 views
6

私はちょうどプライベートコンストラクタを使ってクラスの単体テストを行う必要があります。C#プライベートコンストラクタを持つユニットテストクラスですか?

ここでは、すべてのメソッドも静的でない場合にクラスを初期化せずに単体テストを行う方法を説明します。

プライベートコンストラクタを持つクラスでユニットテスト(リフレクションなし)を行う方法はありますか?

+0

基本的に、ではない可能性反射せずに、しかし、あなたはあなたがこれらのクラスのインスタンスを作成するにはどうすればよいの周り –

+4

働いていたことができるかどうかを確認するためにあなたのコードサンプルを投稿することができますか?ファクトリメソッド?シングルトン?単体テストがあなたのコードで設計上の問題を示しているのは大好きです。 –

+0

私は、クラスはシングルトンだと思います。あなたは確認できますか? –

答えて

8

このクラスにプライベートコンストラクタがある場合は、これを公開して使用しますか?そうでない場合は、それを単体テストするのが最善であるかもしれません。この場合、パブリックなコードは、このコードを呼び出すことによってこのコードをテストする必要があります。

ユニットテストでは、たとえばアプリケーション層の間でコードをインターフェイスすることで、何が一般に使用されるべきかをテストします。入力を受け、私はこの出力が欲しい。それは本当に単体テストのことです。ユニットテストは、実際のメソッドに何があるか気にしません。あなたが望むものを返す限り、望ましい行動を実行し、あなたはパスを持っています。

+0

まあ、クラス内には何も公開されていません。 –

+6

@WinCoderそれでは、どうやって使っていますか? – bas

+0

今日、私は明確化のために尋ねたところ、コードの誤りを正しく修正しなければならないと言われました。物事を公開するように.... –

2

パブリックAPIでテストする必要があります。テストするクラスがインスタンス化されて使用される方法は、である必要があります。

0

ユニットテストは、通常、コードがそのデザインを満たし、意図どおりに動作するように記述され実行されます。

インスタンスを作成できないプライベートコンストラクタのみを作成するnon-staticクラスを作成すると、決して役に立たない可能性があります。つまり、決してUnit Testableではありません。

テスト可能なユニットであるために:あなたは、クラスのインスタンスを作成することができるはず

  1. テスト可能な関数は、パブリックまたは内部のいずれかである必要があります。

    var anInstance = (YourPrivateClass)Activator.CreateInstance(typeof(YourPrivateClass), true); 
    

    この:あなたは、クラスを公開することができない場合、あなたはまだそれのインスタンスをこのように作成することで簡単にテストすることができFriend Assembly

11

としてあなたのアセンブリを作ることによって、内部機能をテストすることができ あなたがあなたのクラスのインスタンスを与えて、あなたがそれを埋め込むことができます。

もう1つの有用なテストビットは、内部メソッド(プライベートではない)がある場合です。内部クラスをテストクラスに表示させることでアクセスできます。あなたは、内部メソッドを持つクラスのassemblyinfo.csに次の行を追加します。

[assembly: InternalsVisibleTo("YourSolution.Tests")] 
0

それはシングルトンであるかもしれない、あなたはクラスのpublicコンストラクタを望んでいません。 を持つコンストラクタを飾る: [ExcludeFromCodeCoverage]

関連する問題