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

タイプ 'System.MissingMethodException' の例外が mscorlib.dll で発生しましたが、ユーザー コードで処理されませんでした 追加情報: 不足しているメンバーにアクセスしようとしました。

私は何を間違っていますか?メソッドは存在します..

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 に答える