24

多くの内部関数を持つクラスを単体テストしようとしています。これらも明らかにテストが必要ですが、主に多くの小さな関連プロジェクトをカバーしているため、私の Tests プロジェクトは別のものです。私がこれまでに持っているものは次のとおりです。

FieldInfo[] _fields = 
    typeof(ButtonedForm.TitleButton).GetFields(
        BindingFlags.NonPublic | BindingFlags.Instance | 
        BindingFlags.DeclaredOnly);
Console.WriteLine("{0} fields:", _fields.Length);
foreach (FieldInfo fi in _fields)
{
    Console.WriteLine(fi.Name);
}

これにより、すべてのプライベート メンバーが適切に吐き出されますが、内部はまだ表示されません。Visual Studio が生成できる自動生成されたテストをいじっていたときに、Test プロジェクトに内部を表示することについて尋ねたので、これが可能であることはわかっています。さて、今私は NUnit を使っていてとても気に入っていますが、どうすれば同じことを達成できるのでしょうか?

4

5 に答える 5

32

InternalsVisibleTo属性を使用して、アセンブリの内部メンバーへのアクセスを単体テスト アセンブリに許可する方が適切です。

役立つ追加情報とウォークスルーのリンクを次に示します。

実際にあなたの質問に答えるには... Internal と protected は .NET Reflection API では認識されません。以下はMSDNからの引用です。

C# のキーワード protected および internal は、IL では意味がなく、Reflection API では使用されません。IL で対応する用語は、Family と Assembly です。Reflection を使用して内部メソッドを識別するには、IsAssemblyプロパティを使用します。保護された内部メソッドを識別するには、IsFamilyOrAssemblyを使用します。

于 2008-10-05T01:44:30.940 に答える
6

コードにはフィールドのみが表示されています。フィールドは常にプライベートIMOである必要があるため、内部メンバーが表示されないことを願っています。(定数の潜在的な例外を除いて。)

ButtonedForm.TitleButtonには実際に非プライベートフィールドがありますか?内部メソッドを見つけようとしている場合は、明らかにそれらを取得するために呼び出すGetMethods(またはGetMembers)必要があります。

他の人が示唆しているように、テストにInternalsVisibleToは非常に便利です(そしてほとんどテストのためだけに!)。内部メソッドをテストする必要があるかどうかについては、テストできると便利だと思います。私は、単体テストをブラックボックステストだけだとは考えていません。多くの場合、パブリック機能が単純な方法で接続されたいくつかの内部メソッドを使用して実装されていることがわかっている場合は、各内部メソッドの徹底的なテストと、パブリックメソッドのいくつかの「疑似統合」テストを実行する方が簡単です。

于 2008-10-05T06:48:48.423 に答える
6

InternalsVisibleToアセンブリ レベル属性をメイン プロジェクトに追加すると、アセンブリ名が 3 つのテスト プロジェクトになり、内部メンバーが表示されます。

たとえば、クラス外のアセンブリに次を追加します。

[assembly: InternalsVisibleTo("AssemblyB")]

または、より具体的なターゲティングの場合:

[assembly:InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

アプリケーション アセンブリに厳密な名前が付いている場合は、テスト アセンブリにも厳密な名前を付ける必要があることに注意してください。

于 2008-10-05T01:44:43.483 に答える
6

プライベート メソッドの単体テストを作成する必要があるかどうかを尋ねる必要があると思いますか? 「合理的な」コード カバレッジでパブリック メソッドの単体テストを作成する場合、結果として呼び出す必要があるプライベート メソッドを既にテストしていませんか?

テストをプライベート メソッドに結び付けると、テストがより脆弱になります。テストを中断することなく、プライベート メソッドの実装を変更できる必要があります。

参照:

http://weblogs.asp.net/tgraham/archive/2003/12/31/46984.aspx http://richardsbraindump.blogspot.com/2008/08/should-i-unit-test-private-methods.html http://junit.sourceforge.net/doc/faq/faq.htm#tests_11 http://geekswithblogs.net/geekusconlivus/archive/2006/07/13/85088.aspx

于 2008-10-05T01:47:13.133 に答える
1

InternalsVisibleを使用する理由は、私の状況下にあります。チャートコントロールのソースコードを購入します。そのソース管理にいくつかの変更を加えて、独自のバージョンをコンパイルする必要がある場所を見つけました。ここで、何も壊れていないことを確認するために、いくつかの内部フィールドにアクセスする必要がある、作成する必要のあるいくつかの単体テストがあります。

これは、InternalsVisibleが理にかなっている完璧なケースです。

しかし、ソースにアクセスできない場合はどうしますか?どうすれば内部フィールドにたどり着くことができますか?.Net Reflectorはそのコードを見ることができますが、ILを見ているだけだと思います。

于 2009-06-03T20:41:40.400 に答える