2012-11-16 18 views
36

私はJava EEの世界ですが、現在は.Netプロジェクトに取り組んでいます。 Javaでは、保護されたメソッドをテストしたいときは簡単でしたが、同じパッケージ名のテストクラスで十分でした。 C#に似たものはありますか?保護されたメソッドを単体テストするための良いプラクティスはありますか?私は、公開方法だけをテストすべきだと言っているフレームワークと人々を見つけました。 フレームワークを使わなくても可能です。ユニットテストC#で保護されたメソッド

ありがとうございます。

答えて

45

テストクラスでテストするクラスを継承できます。

public class Test1 : SomeClass 
{ 
    Asert.AreEqual(1, SomeClass.ProtectedMethod()); 
} 
+0

を含むアセンブリにAssemblyInfo.csに追加あなたの速い答えをいただき、ありがとうございます。私はテストし、それは働いています。私はこれが良い方法であるかどうかは分かりませんが、少なくとも私は単体テストから始めることができます。 – fiso

+1

@unarityテスト対象のクラスにargsコンストラクタがない場合(たとえば、argsコンストラクタが4つしかない場合)はどうなりますか?私がそれから派生すると、私のテストクラスは 'TestClassに0引数を取るコンストラクタが含まれていません.'エラーでコンパイルされません。 –

+1

私のユニットテストプロジェクト内に 'Testable'クラスを追加してクラスを拡張し、 'TestableMethods'を呼び出し、必要に応じてコンストラクタを再実装します。同じ結果が得られましたが、テストと実装を区別したいと思います。 – Gui

3

リフレクションを使用して、プライベートメソッドと保護されたメソッドを呼び出すことができます。

は、より多くのためにここを参照してください:

http://msdn.microsoft.com/en-us/library/66btctbe.aspx

+5

多分私は間違っていますが、私は何かが間違っているので、テストのためにリフレクションが必要であると感じています。しかし、C#でこれがかなり正常であれば、私は慣れるでしょう。 – fiso

+0

私もそれを使用する必要はありません。あなたが気づいていない場合に備えて、このテクニックを指摘したかったのです。少なくとも私は、あなたが独立してテストしたいプライベートメソッドを持っていて、広範な入力と期待される結果で簡単にテストできるようにすることは可能です。 –

+0

私はリフレクションを合理的な方法でクラスの非公開の機能をテストすることを検討します。私はそれがそうでなければあなたが適切に構築されたクラスをテストすることができるように "不正な"修飾子を使用する必要があるので、私はJavaで常にそれを行う。 PrivateまたはProtectedが必要な場合は、アクセスを許可するために実際のクラスに迷惑コードを追加せずにテストすることができます(セキュリティの観点からコードが失敗する原因となります)。 – millebi

3

あなたはすべてのプライベート/ protectedメソッド/フィールドにアクセスするためにPrivateObjectクラスを使用することができます。

PrivateObjectは、単体テストのために通常アクセスできないメンバーを呼び出すことを可能にするラッパーであるMicrosoft単体テストフレームワークのクラスです。

+4

この答えは、PrivateObjectが何であるかを説明すれば多くのメリットがあります。 –

+0

かなりシンプルですが、ドキュメントを参照してください。 https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject.aspx –

2

保護するメソッドは、テストするクラスを継承する新しいクラスに公開できます。

public class ExposedClassToTest : ClassToTest 
{ 
    public bool ExposedProtectedMethod(int parameter) 
    { 
     return base.ProtectedMethod(parameter); 
    } 
} 
5

別のオプションは、これらのメソッドのためinternalを使用して、あなたのテストアセンブリは、これらのメソッドにアクセスできるようにInternalsVisibleToを使用することです。これは、同じアセンブリ内の他のクラスで使用されているメソッドを停止するわけではありませんが、テストアセンブリではない他のアセンブリからアクセスすることを停止します。

これはカプセル化と保護をあまり提供するものではありませんが、これはかなり簡単で便利なことです。

は内部メソッド

[assembly: InternalsVisibleTo("TestsAssembly")] 
関連する問題