1. ホーム
  2. c#

[解決済み] Moqでout/refパラメータを割り当てる

2022-03-15 06:20:18

質問

を割り当てることは可能ですか? out / ref パラメータはMoq(3.0+)を使用していますか?

を使うことを検討しました。 Callback() しかし Action<> はジェネリックをベースにしているため、refパラメータをサポートしていません。また、できれば制約( It.Is ) の入力に ref というパラメータがありますが、これはコールバックで行うことができます。

Rhino Mocksがこの機能をサポートしていることは知っていますが、私が取り組んでいるプロジェクトではすでにMoqを使用しています。

どのように解決するのですか?

Moqバージョン4.8(またはそれ以降)では、バイリファレンス・パラメータのサポートが大幅に改善されました。

public interface IGobbler
{
    bool Gobble(ref int amount);
}

delegate void GobbleCallback(ref int amount);     // needed for Callback
delegate bool GobbleReturns(ref int amount);      // needed for Returns

var mock = new Mock<IGobbler>();
mock.Setup(m => m.Gobble(ref It.Ref<int>.IsAny))  // match any value passed by-ref
    .Callback(new GobbleCallback((ref int amount) =>
     {
         if (amount > 0)
         {
             Console.WriteLine("Gobbling...");
             amount -= 1;
         }
     }))
    .Returns(new GobbleReturns((ref int amount) => amount > 0));

int a = 5;
bool gobbleSomeMore = true;
while (gobbleSomeMore)
{
    gobbleSomeMore = mock.Object.Gobble(ref a);
}

同じパターンで out というパラメータがあります。

It.Ref<T>.IsAny は C# 7 でも動作します。 in パラメータもバイ・リファレンスであるため)。