単体テスト プロジェクトでプライベート メソッドをテストしようとしています。これまでのところうまくいっていますが、out パラメーターを使用してメソッドをテストする必要があるときに問題が発生しました。そのメソッドのシグネチャは次のとおりです。
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
単体テスト (動作していない部分) は次のようになります。
SSI ssi = null;
object[] p = new object[]{ssi,rsi};
Type[] t = new Type[] { typeof(SSI).MakeByRefType(), typeof(RSI) };
actual = (bool) privateTarget.Invoke("GotSSI",t,p);
GotSSI メソッドが機能します。単体テスト内でデバッグ モードでテストしたところ、true または false の値を返す前に、'ssi' out 変数がメソッド内で設定されていることがわかります。しかし、テストが独自のコードに戻ったとき、「ssi」変数はまだ null です。問題は、「GotSSI」メソッドで作成したオブジェクトが、PrivateObject 呼び出しメソッドから解析されないことです。
誰が私が欠けているか知っていますか?
更新 (Rafal による解決策)
Rafalのソリューションは完全に機能し、ソリューションを実装した方法は次のとおりです。
デリゲートを作成しました:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
そして、テストしたいオブジェクトを作成したら、デリゲートを作成します (ターゲットはテストしているオブジェクトです)。
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
その後、デリゲートを呼び出すのは非常に簡単です。
actual = gotSSIInternal.Invoke(out ssi, rsi);
解決策は非常にシンプルで、魔法のように機能します。