【问题标题】:Pass parameters to PrivateObject method [duplicate]将参数传递给 PrivateObject 方法[重复]
【发布时间】:2017-01-05 04:54:59
【问题描述】:

我正在尝试对私有方法进行单元测试。 我在question 上看到了下面的示例

Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);

我的私有方法有 2 个参考参数。 如何通过?

【问题讨论】:

  • 您查看过Invoke 的重载吗?它们都不适合你吗?
  • 试试 -> obj.Invoke("PrivateMethod",ref yourparmarray);
  • @DStanley 是的,我看过这里msdn.microsoft.com/en-us/library/…,但不知道如何使用。我缺少示例。
  • @eomeroff 如果您进行了一些“搜索”,那么最好将您的发现包含在问题中,以解释您从文档中到底不明白什么。
  • 顺便说一句,我和其他许多人建议不要直接对私有方法进行单元测试。一定要确保所有的逻辑路径都被覆盖,但是如果你不能从一个公共方法访问它,你可以确定那行逻辑是死代码。

标签: c# unit-testing private-methods


【解决方案1】:

如果您传递参数数组,则任何ref 参数都将被填充到位:

bool p1 = true; // can be others values
bool p2 = false; // can be others values
object[] args = new object[2] { p1, p2 };
var retval = obj.Invoke("PrivateMethod", args);

p1 = (bool)args[0];
p2 = (bool)args[1];

【讨论】:

  • 我的参数是bool类型。
  • @eomeroff - 查看更新。
  • 如果参数类型混合,而不是所有相同类型怎么办?
【解决方案2】:

首先创建一个参数对象数组。然后数组应该包含新的引用:

Class target = new Class();
PrivateObject obj = new PrivateObject(target);
object[] args = new object[] {arg1, arg2};
var retVal = obj.Invoke("PrivateMethodWithArgs", args);
Assert.AreEqual(retVal);

Debug.WriteLine(args[0]);
Debug.WriteLine(args[1]);

【讨论】:

  • 你不会将args 传递给Invoke :-)
  • @Grundy 错过了,谢谢。
【解决方案3】:

试试这个:

object [] myarray=new object[]{param1,param2};
var retVal = obj.Invoke("PrivateMethod",ref myarray);

【讨论】:

  • 这不是编译。
  • 从 myarray 中移除 ref
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多