2009-07-31 12 views
16

私はVisual Studio 2008の方法でユニットテストを始めています。テスト目的でクロス・アセンブリclassアクセスを達成する最良の方法が何であるか疑問に思っています。ユニットテストのために別のアセンブリのクラスにアクセスするにはどうすればいいですか?

基本的に、私は1つの、溶液中の二つのプロジェクトがあります。

  1. MyProjectと(C#の)
  2. MyProjectTests(C#テストプロジェクト)

MyProjectの中にすべてが現在持っているデフォルトのアクセスを、どのI場合正しくリコールすることは、すべてが効果的であることを意味します。internal。私はほとんどclassレベルでテストしようとしていますが、少数のdelegatesが関わっています。

将来的にはいつでも外部APIが存在するでしょうが、私は完全なフィーチャー(紙では)の約20%を占めています。テストされていないコア。したがって、従来の(読み込み:悪いやや遅い)機能テストや、バージョンn + 1の外部APIが登場する前に、アプリケーションが十分に完了する前に、いくつかのテストをやりたいと思います。

解決策の例は、まっすぐな回答に加えて、非常に高く評価されます。

+1

のようなテストフレームワークを使用しますか? - その件に関する私の記事は次のとおりです。http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

答えて

28

アセンブリレベルの属性InternalsVisibleToAttributeを使用してこれを行うことができます。

あなたのMyProjectのアセンブリにAssemblyInfo.csに

[assembly:InternalsVisibleTo("MyProjectTests")] 

を追加します。

+0

適切な厳密なキーリファレンスが含まれていれば、もちろん - あなたはあなたのアセンブリの名前を強くしていますね。 –

3

あなたはあなたの "MyProjectと(C#の)" のAssemblyInfo.csに

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

を追加する必要があります。これにより、テストで内部テストにアクセスできるようになります。パブリックインターフェイスまたはAPIを介して、あなたの内部クラスをテスト -

+2

壊れたリンクを修正してください – Darcy

1

は、私はこのアプローチに対してお勧めしますしかしあなたがInternalsVisibleToAttribute

を必要とするように見えます。

+0

問題はまだ存在しません。しばらくはないでしょう。大規模なプロジェクトのようなものです(完了したら完了します)。 –

+0

内部のアプローチの問題は、内部の処理を行っている状況に遭遇する可能性がありますが、外部APIが期待通りにプラグインされないことです。フィードバックはずっと後になります。 – Gishu

+0

真実ですが、アプリケーションが「完了」するまで徹底的なテストを延期することは、問題を募ることです。さらに、外部APIは、おそらく機能を拡張するのではなく、ユーザーの操作を自動化しデータを抽出するという形を取ります。本格的なプラグインAPIに比べるとはるかに難しいです。 –

3

あなたは、あなたの主なプロジェクトのためのAssemblyInfo.csに属性を追加するという名前のアセンブリに内部メソッドへのアクセスを与えることによって、内部メソッドをテストすることができます。

[アセンブリ:InternalsVisibleTo( "MyProjectTestsNameSpaceを。MyProjectTests ")]

さらに情報がhere

+0

リンクが切れています:( – User193452

0

[InternalsVisibleTo]はIMO最も賢明な方法ですが、これについて移動するには、少なくとも2つの他の方法があります:

  • Reflection

    var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null); 
    return method.Invoke(instance, parameters); 
    
    を使用することにより

この方法では、メソッド名またはシグネチャが変更された場合、ユニットテストは実行時に失敗し始めますが、[InternalsVisibleTo]はコンパイル時にこの変更が容易に選択されます。テストアセンブリが署名されている場合、なぜテストアセンブリに署名する必要がない -