ユニットテストプロジェクトでプライベートメソッドをテストしようとしています。これまでは素晴らしかったですが、outパラメータを使ってメソッドをテストする必要があるときに、私はバンプを打ちました。そのメソッドのシグネチャは次のとおりです。PrivateObjectがパラメータを返さない
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
とunittestの(動作していない部分)は次のようになります。
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方法の仕事。私は単体テスト内でデバッグモードでテストしましたが、ssi out変数がtrueまたはfalseの値を返す前にメソッド内で設定されていることがわかります。しかし、テストがそれ自身のコードに戻ると、 'ssi'変数はまだヌルです。だから問題は、私が "GotSSI"メソッドで作成したオブジェクトは、PrivateObjectの呼び出しメソッドから解析されないということです。
誰かが私が迷っていることを知っていますか?
更新(ラファウによるソリューション)
ラファウのソリューションの仕事は完璧にして、ここで私は解決策を実装する方法です。
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
:(ターゲットは、私がテストしていたオブジェクトである)
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
そして私は、私がテストしたいオブジェクトを作成したとき、私は、デリゲートを構築:
は私がデリゲートを作成しました解決策は非常に簡単で、魔法のように動作actual = gotSSIInternal.Invoke(out ssi, rsi);
:その後、デリゲートを呼び出すことは非常に簡単です。
はあなたのためにこれらを作るためのヘルパークラスを定義することは意味したりすることがあります:内部の静的T MakeDelegate(文字列methodNameの、Tのターゲット) {return(T)Delegate.CreateDelegate(typeof(T)、target、typeof(C).GetMethod(methodName、BindingFlags.NonPublic | BindingFlags.Instance));}しかし、おそらくあなたは既にそれを考えていました。 :-) –
JLRishe
本当に。この問題を抱えたのは1つのテストだけでしたが、私は時間がかかっていませんでした。良い考えではない。 – evilfish