如何为`in`参数修饰符设置Moq回调?

4

如何为带有 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修饰符之外,什么是正确的方法?

1
你是否考虑过尝试文档中给出的refout的相同方法?https://github.com/Moq/moq4/wiki/Quickstart#callbacks - Nkosi
2
将回调更改为使用.Callback((int v) => { /* whatever */ });,以便代码可以推断出您打算使用哪个Callback扩展。 - Nkosi
我已经查看了那个页面...并且很想念它。它可以使用委托来工作。将其作为答案,我会接受它。谢谢。 - dstj
1个回答

1
一种可能的解决方案是使用类似签名(匹配输入参数)定义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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接