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中文网其他相关文章!