gpt4 book ai didi

c# - 从 shim 方法调用原始方法

转载 作者:太空狗 更新时间:2023-10-30 00:32:03 26 4
gpt4 key购买 nike

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

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

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

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

我在真实应用程序中遇到了最后一个场景,无法在 SO 上找到 Fakes 的答案。然而,在深入研究 Fakes 文档后,我找到了答案,因此将其与社区的问题一起发布。

最佳答案

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。

关于c# - 从 shim 方法调用原始方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20479323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com