模型;使用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的"缺点"-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类的泛型类型,T1
和T2
是该方法的参数。
然而,调用此方法将导致编译器错误:
无法根据用法推断方法
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的隐式转换
然而,为了执行这种隐式转换,编译器需要知道T1
和T2
的类型。但这些类型只有在转换发生后才能推断出来
这两个步骤相互依赖,这就是为什么它不起作用。