2013-12-09 47 views
4

为BCL(或任何图书馆)中的类型成员创建垫片时。我们经常面临一种情况,我们想要调用我们已经使用过的原始方法(无论是在代理内部还是在外部)。例如: -从填充方法调用原始方法

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

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

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

我面对实际应用程序中的最后一个场景,无法找到SO上的Fakes的答案。但是,在深入了解Fakes文档后,我找到了答案,并将其与社区问题一起发布。

回答

8

Fakes有内置的支持;实际上有two ways来实现这一点。

1)使用ShimsContext.ExecuteWithoutShims()作为代码,你不需要垫片行为的包装:

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

2)另一种方法是设置垫片为null,调用原始的方法和恢复垫片。

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; 

编辑:显然,第一种方法是更简洁和可读。所以我更喜欢它明确地声明垫片变量和删除/恢复垫片。