【问题标题】:Unit Test c# for Private Method [duplicate]私有方法的单元测试c#[重复]
【发布时间】: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)”的方法。

标签: c# unit-testing


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 2014-08-10
      • 1970-01-01
      • 2010-12-03
      • 2013-11-09
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多