模型;使用Moq分配代理

本文关键字:分配 代理 Moq 使用 模型 | 更新日期: 2023-09-27 17:58:52

当前

我使用Moq来创建一些mock对象;到目前为止,一切都很顺利。目前使用Moq"分配"一名代表,我正在进行

var someMock = new Mock<ISomeInterface>();
someMock.Setup(x => x.DoSomething(It.IsAny<int>())).Returns(this.DoSomething)

其中,this.DoSomething是接受int参数的方法;从根本上讲,它与CCD_ 5上的CCD_。

问题

是否可以简单地分配一个委托,而不需要指定其所有参数,即不使用It.IsAny<int>()?理想情况下是这样的:

var someMock = new Mock<ISomeInterface>();
someMock.Setup(x => x.DoSomething).Returns(this.DoSomething)

模型;使用Moq分配代理

不,这是不可能的。这不是Moq的"缺点"-C#不支持它。

一些背景:

假设ISomeInterface声明如下:

public interface ISomeInterface
{
    void Foo(int a, int b);
}

这意味着Setup方法的参数必须是Func<ISomeInterface, Action<int, int>>
现在的问题是,Setup方法必须以通用的方式定义,因为您的方法可以有任何类型的参数:

Setup<T1, T2>(Func<T, Action<T1, T2>> param)

T是Mock类的泛型类型,T1T2是该方法的参数。

然而,调用此方法将导致编译器错误:

无法根据用法推断方法Mock.Setup<T1, T2>(System.Func<UserQuery.ISomeInterface,System.Action<T1,T2>>)的类型参数。请尝试显式指定类型参数。

为了让它发挥作用,你需要这样称呼它:

someMock.Setup<int, int>(x => x.DoSomething)

或者像这样:

someMock.Setup(x => (Action<int, int>)x.DoSomething);

在这两种情况下,您都必须指定参数的类型,就像您现在所做的那样。

至于为什么会出现编译器错误:

CCD_ 15是一个方法组。存在到CCD_ 16的隐式转换
然而,为了执行这种隐式转换,编译器需要知道T1T2的类型。但这些类型只有在转换发生后才能推断出来
这两个步骤相互依赖,这就是为什么它不起作用。