繁体   English   中英

Moq的It.IsAny怎么样? <T> ()实施

[英]How is Moq's It.IsAny<T>() implemented

对于C#的Moq,我通过调试器进入,并注意到It.IsAny<T>()只是编译为T的某个值,如GuidGuid.Emptyint的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM