[.NET] Private Method 如何做 Unit Test

有些方法不想對外開放的時候,會設置成 Internal(只開放專案內部可以使用)或是 Private,但是當要寫測試的時候就會發現 Test Project 也無法使用該 Method,解決方法是將需要測試的 Method 都設成 Internal,並將該 Method 的所在 Project 設置 InternalsVisibleTo 即可。

以下會展示一下 .net framework 與 .net core 各要如何添加 InternalsVisibleTo 。

 

 

 

.net framework

在專案的 Properties 目錄下編輯 AssemblyInfo.cs,指定 Internal 要開放外部的 Test Project 名稱

[assembly: InternalsVisibleTo("MyProject.UnitTest")]

 

 

.net core

由於 .net core 已經沒有 AssemblyInfo.cs 了,設置位置不太一樣。

有以下兩種設置方式,擇一即可。


 

(一)在被測試的各別 Class 加 attribute (要在 namespace 上方)

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("MyProject.UnitTest")]
namespace MyProject.Library;

public class MyService
{
    internal string GetName()
    {
        ................
    }
}

 

(二)csproj 中進行全域的設置 ↓

<ItemGroup>
     <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
          <_Parameter1>MyProject.UnitTest</_Parameter1>
     </AssemblyAttribute>
</ItemGroup>

 

如果是在 csproj 設置的,在 .net core 他會自動幫你產生 AssemblyInfo,在 build 後至 obj 資料夾中可以看到 (如果是加 attribute 的方式就不會生成 AssemblyInfo)

 

裡面也會跟 .net framework 的  AssemblyInfo.cs 長的差不多