首页 > 解决方案 > 如何为“in”参数修饰符设置 Moq 回调?

问题描述

如何为带有in参数修饰符的方法设置 Moq 设置回调?

假设你有这个:

public interface ITester
{
   bool IsGood(in int value);
}

这不起作用:

var mock = new Mock<ITester>();
mock.Setup(m => m.IsGood(It.IsAny<int>()))
    .Callback<int>(v => { /* whatever */ });  // ==> runtime error

mock.Object.IsGood(42);

您会收到以下异常:

System.ArgumentException : Invalid callback. Setup on method with parameters (in int) cannot invoke callback with parameters (int).

什么是正确的方法(除了in完全删除修饰符;))?

标签: c#moq

解决方案


一种可能的解决方案是delegate使用类似的签名(匹配输入参数)定义并在回调中使用它+It.Ref<int>.IsAny在设置中使用:

public delegate void MyDelegate(in int value);
var d = new MyDelegate((in int a) => { Console.WriteLine($"Number {a}"); });

var mock = new Mock<ITester>();
mock.Setup(m => m.IsGood(It.Ref<int>.IsAny)).Callback(d);

mock.Object.IsGood(42); //Number 42

推荐阅读