C# 中单元测试私有方法的挑战
由于私有方法的封装特性,在 C# 中单元测试私有方法可能比较棘手。虽然 Visual Studio 提供了自动生成的访问器类,但测试过程中仍可能出现运行时错误。
代码示例和测试用例
考虑以下代码片段及其对应的测试:
<code class="language-csharp">// 被测试单元 class TypeA { private List<TypeB> myList = new List<TypeB>(); private void MyFunc() { /* 忽略处理过程 */ } } // 单元测试 public void MyFuncTest() { TypeA_Accessor target = new TypeA_Accessor(); target.myList.Add(new TypeA_Accessor.TypeB()); target.MyFunc(); }</code>
运行时错误
编译成功,但由于类型转换问题导致运行时错误:
<code>无法将类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' 的对象转换为类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]' 的对象。</code>
根本原因在于 target
的类型是 TypeA_Accessor
,而不是预期的 TypeA
。这种不匹配导致转换失败。
解决方案
.NET Core 2.0 之前
使用 PrivateObject
类访问私有方法和字段:
<code class="language-csharp">PrivateObject target = new PrivateObject(new TypeA()); var retVal = target.Invoke("MyFunc");</code>
.NET Core 2.0 及更高版本
PrivateObject
类不再受支持。替代方法是将私有方法设置为 internal
以便进行测试,或者考虑重构代码以避免测试私有方法的需要。
以上是如何在 C# 中有效地对私有方法进行单元测试,同时避免运行时错误?的详细内容。更多信息请关注PHP中文网其他相关文章!