私有方法的单元测试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】:

您需要实例化CheckWarehouseAvailabilityOrder 参数并将其作为参数传递给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 的私有方法和属性的单元测试用例 [重复]

C# - 单元测试 - 初始化私有字段 - ASP.NET Core 5 - NUnit 测试

基于C#的单元测试(VS2015)

将私有方法公开以对其进行单元测试...好主意吗?

如何在 Typescript 中对私有方法进行单元测试

如何在Typescript中对私有方法进行单元测试