web-dev-qa-db-ja.com

VS2017.Net標準ライブラリの内部テスト内部メソッド

私は現在、.Net Standard 1.6ライブラリを作成することにより、最新のVisual Studio 2017 Release Candidateを試しています。私はxUnitを使って自分のコードを単体テストしていますが、VS2017で内部メソッドをテストできるかどうか疑問に思いました。

私はあなたが指定されたプロジェクトが内部メソッドを見ることを可能にするVS2015のすべての行AssemblyInfo.csクラスができることを覚えています

[Assembly:InternalsVisibleTo("MyTests")]

VS2017.Net標準プロジェクトにAssemblyInfo.csクラスがないので、内部メソッドを単体テストできるかどうか疑問に思いましたか。

111
Phil Murray

.InternalsVisibleToAttributeの.NETドキュメント によると、

属性はアセンブリレベルで適用されます。つまり、ソースコードファイルの先頭に含めることも、Visual StudioプロジェクトのAssemblyInfoファイルに含めることもできます。

言い換えれば、あなたはそれをあなた自身の任意の名前の.csファイルに単に置くことができ、それはうまく動作するはずです:

// some .cs file included in your project
using System.Runtime.CompilerServices;
[Assembly:InternalsVisibleTo("MyTests")]
167
Groo

"InternalsVisibleTo"属性は、.Netのためのあらゆる種類の "ホワイトボックス"(10年の期間、私は推測する)テストの鍵です。先頭に "Assembly"属性を持つ任意のc#ファイルに配置できます。 MS DOCは、アセンブリ名が署名されている場合は、公開鍵トークンによって修飾されなければならないと言っていることに注意してください。それがうまくいかないこともあり、その場で完全公開鍵を使わなければなりません。内部へのアクセスは、並行システムのテストやその他多くの状況で重要です。 https://www.Amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 を参照してください。この本の中で、Meszarosは基本的にプログラム開発への「テストのための設計」アプローチを構成する様々なコーディングスタイルを説明します。少なくともそれが私が長年にわたって使用してきた方法です。

5
kurt.matis

最初の答えは完璧ですが。それでも元のAssemblyInfoでこれを実行したいと思う場合は、いつでもファイルを自動生成しないで手動で追加することを選択できます。

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

詳細については、 https://stackoverflow.com/a/47075759/8690 を参照してください。

3
Nick N.

もう1つの方法は、テストする必要があるクラス(たとえばMyFoo)からのパブリックメソッドおよびインセレットを含む、「ラッパー」TestMyFooパブリッククラスをターゲットプロジェクト内で使用することです。これらのパブリックメソッドは、テストしたい基本クラスを呼び出すだけです。

ターゲットプロジェクトでテストフックを出荷することになるので、それは「理想的」ではありません。しかし、最新の信頼性の高い自動車には診断ポートが付属し、最新の信頼性の高い電子機器にはJTAG接続が付属しています。しかし、診断ポートを使って自分の車を運転するほど愚かな人は誰もいません。

0
andrew pate