1

デリゲートされたメソッドを一度だけ/モルで一度だけ呼び出すことはどのように可能ですか?

MyClass.AllInstances.ResultateGet = delegate { return new ResultatInfoCollection(); };

メソッド "ResultateGet" を 1 回だけ呼び出したいのは、init がデリゲートなしで初めて非常に複雑になるためです。

target.UpdateResultate(); //calls delegate "ResultateGet"
//Assert some stuff
target.Verify(); //needs original function "ResultateGet" so unit test is useful

私は一般的に、デリゲートではなく元の関数が呼び出される前に、モルデリゲートを1回または特定の回数呼び出す方法に興味があります。

更新: 少し面倒な方法を見つけました。より良い解決策はありますか?

ResultatInfoCollection x = new ResultatInfoCollection();
MolesContext.ExecuteWithoutMoles(() => x = target.Resultate);
4

2 に答える 2

2

また、私の回答を参照してください: How to assign/opt from multiple delegates for a 'moled' method? これは、匿名メソッド内のゲーティング ロジックの例を示しています。

おお、いい質問だ!私はこれに遭遇しました。あなたが探しているのは、「フォールスルー」動作 (元のコードの実行) と呼ばれるものです。Moles が迂回する匿名メソッドには、最初の呼び出しの後に通過するスイッチング メカニズムが含まれている必要があります。残念ながら、現時点ではフォールスルー機能が Moles に含まれているとは思えません。

更新された回避策はまさにあなたが必要とするものです.fallthroughを呼び出すと同じことが起こります. 呼び出しをゲートするセンチネル値doFallthroughを追加することをお勧めします。

bool doFallthrough = false;
ResultatInfoCollection x = new ResultatInfoCollection();
MyClass.AllInstances.ResultateGet = delegate { 
    if (!doFallthrough)
    {
        doFallthrough = true;
        return new ResultatInfoCollection();
    }
    MolesContext.ExecuteWithoutMoles(() => x = target.Resultate);
};

特定の回数呼び出すには、番兵の値の型を変更するだけです。

int doFallthrough = 0;
ResultatInfoCollection x = new ResultatInfoCollection();
MyClass.AllInstances.ResultateGet = delegate { 
    if (++doFallthrough < 5)
        return new ResultatInfoCollection();
    MolesContext.ExecuteWithoutMoles(() => x = target.Resultate);
};
于 2011-08-04T22:34:59.957 に答える