13

我有这堂课:

public class MyClass
{
   private static int GetMonthsDateDiff(DateTime d1, DateTime d2)
   {
     // implementatio
   }
}

现在我正在为它实施单元测试。由于该方法是私有的,我有以下代码:

MyClass myClass = new MyClass();
PrivateObject testObj = new PrivateObject(myClass);
DateTime fromDate = new DateTime(2015, 1, 1);
DateTime toDate = new DateTime(2015, 3, 17);
object[] args = new object[2] { fromDate, toDate };
int res = (int)testObj.Invoke("GetMonthsDateDiff", args); //<- exception

mscorlib.dll 中出现“System.MissingMethodException”类型的异常,但未在用户代码中处理其他信息:尝试访问缺少的成员。

我究竟做错了什么?方法存在..

4

5 回答 5

26

它是一个静态方法,所以使用PrivateType代替PrivatObject来访问它。

请参阅PrivateType

于 2015-02-16T18:08:54.527 回答
11

将以下代码与 PrivateType 一起使用

MyClass myClass = new MyClass();
PrivateType testObj = new PrivateType(myClass.GetType());
DateTime fromDate = new DateTime(2015, 1, 1);
DateTime toDate = new DateTime(2015, 3, 17);
object[] args = new object[2] { fromDate, toDate };
(int)testObj.InvokeStatic("GetMonthsDateDiff", args)
于 2016-03-31T11:25:33.673 回答
4

Invoke方法是找不到的。该类Object没有Invoke方法。我认为您可能正在尝试使用Invoke,它是System.Reflection.

可以这样使用

var myClass = new MyClass();
var fromDate = new DateTime(2015, 1, 1);
var toDate = new DateTime(2015, 3, 17);
var args = new object[2] { fromDate, toDate };

var type = myClass.GetType();
// Because the method is `static` you use BindingFlags.Static 
// otherwise, you would use BindingFlags.Instance 
var getMonthsDateDiffMethod = type.GetMethod(
    "GetMonthsDateDiff",
    BindingFlags.Static | BindingFlags.NonPublic);
var res = (int)getMonthsDateDiffMethod.Invoke(myClass, args);

但是,您不应该尝试测试private方法;它过于具体,可能会发生变化。相反,您应该将其设为私有public的类,或者可能将其设为私有类,因此您只能在程序集中使用。DateCalculatorMyClassinternal

于 2015-02-16T18:05:06.313 回答
1
int res = (int)typeof(MyClass).InvokeMember(
                name: "GetMonthsDateDiff", 
                invokeAttr: BindingFlags.NonPublic |
                            BindingFlags.Static |
                            BindingFlags.InvokeMethod,
                binder: null, 
                target: null, 
                args: args);
于 2015-02-16T18:02:11.600 回答
1
MyClass myClass = new MyClass();
PrivateObject testObj = new PrivateObject(myClass);
DateTime fromDate = new DateTime(2015, 1, 1);
DateTime toDate = new DateTime(2015, 3, 17);
object[] args = new object[2] { fromDate, toDate };

//The extra flags
 BindingFlags flags = BindingFlags.Static| BindingFlags.NonPublic
int res = (int)testObj.Invoke("GetMonthsDateDiff",flags, args); 
于 2016-09-12T11:45:44.973 回答