web-dev-qa-db-ja.com

内部クラスライブラリをテストする方法

複雑なオブジェクトを作成するクラスライブラリを作成したいのですが、できるだけ公開しないでください。私はそれを他のプロジェクトに含めたいのですが、このライブラリへの呼び出しは1回だけです。内部的に作成されたクラスのオブジェクトを返します。他の人がこれらのオブジェクトを明示的に作成できるようにしたくありませんが、それでもこのクラスライブラリのテストプロジェクトを作成したいと思います。

例えば:

var result = Manager.Instance.Create(definition)

これは、クラスライブラリへの唯一のアクセスである必要があります。

定義パラメーターに基づいて、異なるサブクラスを使用して要求されたインスタンスを作成し、それに応じてそのプロパティを設定します。そのため、作成プロセス全体が正常に機能したことをテストによって何らかの形で保証したいと思います。しかし、結果オブジェクトの内部プロパティもほとんど公開したくないので、アサートするプロパティがないため、このパブリックアクセスメソッドのみを使用してテストすることはできません。

私はあなたが内部のメカニズムをテストするべきではないことを知っています、そしてそれは通常悪いデザインであり、私はまた読みました この記事 その後、このクラスへのアクセスを制限しますか?ラッパーか何かで?

54
Thomas Mondel

.NETでは、クラスライブラリで InternalsVisibleToAttribute を使用して、内部型を単体テストプロジェクトから見えるようにすることができます。

これにより、クラスを内部に保持し、アクセスを許可する他のアセンブリからクラスを引き続き使用できます。

次のように使用します。

[Assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
132
Wouter de Kort

最新のcsproj 2017形式のプロジェクトの場合、プロジェクトにAssemblyInfo.csファイルには、次を追加できます。

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

MSBuildProjectNameなどのAssemblyNameを置き換えるために他の変数を使用することも、unittestプロジェクト名を直接使用することもできます。

ProjectName.AssemblyInfo.cs objフォルダー(obj\Debug\netstandard2.0InternalsVisibleToを追加して更新されました。

4
Feiyu Zhou