[英]How is Moq's It.IsAny<T>() implemented
对于C#的Moq,我通过调试器进入,并注意到It.IsAny<T>()
只是编译为T
的某个值,如Guid
的Guid.Empty
, int
的0,等等。
Moq如何区分It.IsAny<T>
与它编译的值之间的It.IsAny<T>
?
以GitHub源代码为基础 ,真正匹配的是谓词类型Predicate<T>
(或Func<T, bool>
如果你喜欢):
value => value == null || typeof(TValue).IsAssignableFrom(value.GetType())
它检查value
是否为null,或者该value
是否与使用Type.IsAssignableFrom的 IsAny<TValue>
的TValue
参数的类型相同。
然后,它返回类型的default(T)
值,以允许模拟方法正确匹配签名。 正如DavidH所指出的,你不能对值类型使用null,这就是为什么使用default(T)作为泛型返回值的首选。
我们在Moq中Setup
模拟时使用的lambda 不是通常的委托,它们是表达式树 。 It.Is<>
方法只是一个占位符。 它实际上不一定被称为。 如果它返回default(T)
或仅抛出NotSupportedException
或其他内容并不重要。 让我举个例子吧:
interface IMyFace
{
void MethodToTest(object obj);
}
static class Test
{
public static void Main()
{
Setup<IMyFace>(x => x.MethodToTest(null));
Setup<IMyFace>(x => x.MethodToTest(MyAnyA<object>()));
Setup<IMyFace>(x => x.MethodToTest(MyAnyB<object>()));
}
public static TArg MyAnyA<TArg>()
{
// never runs
return default(TArg);
}
public static TArg MyAnyB<TArg>()
{
// never runs
return default(TArg);
}
public static void Setup<T>(Expression<Action<T>> expr) where T : class
{
Console.WriteLine("The expr was: " + expr);
}
}
不太有趣,但它应该表明,使用表达式Expression<...>
您可以看到使用了什么方法,而不仅仅是返回的值。 详细了解如何检查MSDN上的表达式树,表达式树 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.