私有方法的单元测试c#[重复]
Posted
技术标签:
【中文标题】私有方法的单元测试c#[重复]【英文标题】:Unit Test c# for Private Method [duplicate] 【发布时间】:2018-01-15 16:49:23 【问题描述】:我需要在一个抽象类中测试CheckWarehouseAvailability
私有方法。
public abstract class BaseAPI
private void CheckWarehouseAvailability(Order order)
//codes here
public class Processor : BaseAPI
这是我的测试方法
Processor pro = new Processor();
PrivateObject privBase = new PrivateObject(pro, new PrivateType(typeof(BaseAPI)));
var retVal = privBase.Invoke("CheckWarehouseAvailability(order)");
Assert.AreEqual(true, retVal);
当我运行测试方法时,我得到了这个错误:An exception of type 'System.MissingMethodException' occured in mscorlib.dll but was not handled in user code
【问题讨论】:
参数 (order
) 需要在调用之前构造并作为附加参数传递给Invoke
。就像当前编写的一样,您尝试调用一个名称中包含字符串“(order)”的方法。
【参考方案1】:
您需要实例化CheckWarehouseAvailability
的Order
参数并将其作为参数传递给PrivateObject.Invoke()
:
var order = new Order();
var retVal = privBase.Invoke("CheckWarehouseAvailability", order);
// ... Assert
MSDN:
PrivateObject.Invoke(String, Object[])
另外,我不确定你在这里断言什么:
Assert.AreEqual(true, retVal);
...CheckWarehouseAvailability
的返回类型设置为void
,而不是bool
。
【讨论】:
【参考方案2】:首先需要通过反射获取方法
MethodInfo methodName = privBase.GetType().GetMethod("ShowGrid",
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
然后用你的参数调用方法
var retVal=methodName .Invoke(privBase, order);
【讨论】:
以上是关于私有方法的单元测试c#[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 FakeItEasy 的私有方法和属性的单元测试用例 [重复]