簡體   English   中英

如何測試內部 class 庫?

[英]How to test internal class library?

我想寫一個 class 庫,它為我創建一個復雜的 object 但應該盡可能少地公開。 我希望它被包含到其他項目中,並且我只有一次調用這個庫,例如返回一個內部創建的 class 的 object。我不想讓其他人明確地創建這些對象,但我仍然想為此 class 庫創建一個測試項目。

例如:

var result = Manager.Instance.Create(definition)

這應該是訪問 class 庫的唯一方法。

根據定義參數,它使用不同的子類來創建請求的實例並相應地設置其屬性。 因此,我想通過測試以某種方式確保整個創建過程運行良好。 但是由於我也不想公開結果 object 的非常少的內部屬性,所以我無法僅使用此公共訪問方法進行測試,因為我沒有任何屬性可以斷言。

我知道你不應該測試內部機制,這通常是糟糕的設計,我也在閱讀這篇文章,但是否有任何方法可以創建一個庫加單元測試項目,然后可能會限制對此 class 的訪問? 用包裝紙之類的?

在 .NET 中,您可以使用類庫中的InternalsVisibleToAttribute使內部類型對單元測試項目可見。

這樣,您可以將您的類保留在內部,並且仍然可以從您授予訪問權限的其他程序集中使用它。

你像這樣使用它:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]

對於最新的csproj 2017格式化項目,如果你的項目沒有AssemblyInfo.cs文件,可以添加如下設置:

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

您還可以使用其他變量來替換MSBuildProjectName例如AssemblyName或直接使用 unittest 項目名稱。

您可以通過添加InternalsVisibleTo來檢查 obj 文件夾( obj\\Debug\\netstandard2.0 )中的ProjectName.AssemblyInfo.cs是否已更新。

就我而言(.NET5 應用程序)我需要兩個 csproj 條目:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>MyAppName.UnitTests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

並將 internalvisibleto 屬性添加到我的 class 以使其工作:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] 
namespace MyAppName.Api.Something...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM