【问题标题】:Calling the original method from shim method从 shim 方法调用原始方法
【发布时间】:2013-12-10 03:48:16
【问题描述】:

在为 BCL(或任何库)中的类型成员创建 shim 时。我们经常面临这样一种情况,我们想要调用我们已经覆盖的原始方法(无论是在 shim 委托内部还是外部)。例如:

System.Fakes.ShimDateTime.NowGet = () => DateTime.Now.AddDays(-1);

在上面的代码中,当 DateTime.Now 被调用时,我们想要做的就是返回比实际日期少的一天。也许这看起来像是一个人为的例子,所以其他(更)现实的场景是

  1. 能够捕获和验证传递给特定方法的参数值。
  2. 要能够计算一次的次数 特定方法/属性由被测代码访问。

我在实际应用程序中遇到了最后一种情况,但无法找到 Fakes on SO 的答案。但是,在深入研究 Fakes 文档后,我找到了答案,因此将其与社区的问题一起发布。

【问题讨论】:

    标签: c# unit-testing microsoft-fakes shim


    【解决方案1】:

    Fakes 对此有内置支持;其实有two ways可以实现这个。

    1) 使用 ShimsContext.ExecuteWithoutShims() 作为您不需要 shim 行为的代码的包装器:

    System.Fakes.ShimDateTime.NowGet = () => 
    {
    return ShimsContext.ExecuteWithoutShims(() => DateTime.Now.AddDays(-1));
    };
    

    2)另一种方法是将shim设置为null,调用原始方法并恢复shim。

    FakesDelegates.Func<DateTime> shim = null;
    shim = () => 
    {
    System.Fakes.ShimDateTime.NowGet = null;
    var value = ShimsContext.ExecuteWithoutShims(() => DateTime.Now.AddDays(-1));
    System.Fakes.ShimDateTime.NowGet = shim;
    return value;
    };
    System.Fakes.ShimDateTime.NowGet = shim;
    

    编辑:显然第一种方法更简洁易读。所以我更喜欢它而不是显式声明 shim 变量并删除/恢复 shim。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-04
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多