小编典典

在Moq中分配输出/参考参数

c#

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

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

我知道Rhino Mocks支持此功能,但是我正在从事的项目已经在使用Moq。


阅读 258

收藏
2020-05-19

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

2020-05-19