小编典典

在 Moq 中分配 out/ref 参数

all

是否可以使用 Moq (3.0+)分配out/参数?ref

我看过 using Callback(),但Action<>不支持 ref 参数,因为它基于泛型。我还希望It.Is在参数的输入上设置一个约束
( ) ref,尽管我可以在回调中这样做。

我知道 Rhino Mocks 支持这个功能,但是我正在做的项目已经在使用 Moq。


阅读 97

收藏
2022-03-30

共1个答案

小编典典

Moq 版本 4.8(或更高版本)对 by-ref 参数的支持有了很大改进:

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# 7in参数(因为它们也是 by-ref)。

2022-03-30