C#私有方法檢定
為了實現全面的程式碼覆蓋率,需要測試私有方法。一種方法是使用Visual Studio產生的存取器類別。但是,這種方法可能會由於類型不匹配而遇到運行時錯誤。
考慮以下程式碼片段:
<code class="language-csharp">// 在MyProj项目中 class TypeA { private List<TypeB> myList = new List<TypeB>(); private class TypeB { public TypeB() { } } public TypeA() { } private void MyFunc() { // 更改实例状态的myList处理 } }</code>
問題:
私有方法MyFunc的單元測試在運行時失敗,並出現以下錯誤:
<code>无法将类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]'的对象转换为类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'的对象。</code>
這是因為訪問器類別產生了myList的不同實現,其類型參數也不同。
解:
在早於2.0版本的.NET Core中,可以使用PrivateObject類別來呼叫私有方法:
<code class="language-csharp">// 在TestMyProj项目中 public void MyFuncTest() { TypeA target = new TypeA(); PrivateObject obj = new PrivateObject(target); // 下一行不会抛出异常 obj.Invoke("myList", new object[] { new TypeA_Accessor.TypeB() }); obj.Invoke("MyFunc"); // 检查target的更改状态 }</code>
但是,.NET Core 2.0及更高版本已刪除對PrivateObject和PrivateType的支援。在這種情況下,請考慮重構程式碼以使私有方法可測試,或採用基於反射的方法。
以上是面對型別差異時,如何有效測試 C# 中的私有方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!