While creating shims for members of types in BCLs (or of any library for that matter). We often face a situation where we want to call the original method which we have overidden (be it inside the shim delegate or outside). E.G.:
System.Fakes.ShimDateTime.NowGet = () => DateTime.Now.AddDays(-1);
In the above code, all we want to do when the DateTime.Now is called is to return a day less than the actual date. Maybe this looks like a contrived example so other (more) realistic scenarios are
- To be able to capture and validate the argument values being passed to a particular method.
- To be able to count the number of times a particular method/property is accessed by the code under test.
I faced with the last scenario in a real application and couldn't find an answer for Fakes on SO. However, after digging into Fakes documentation, I have found the answer so posting it along with the question for the community.
Fakes has a built in support for this; in fact there are two ways to achieve this.
1) Use ShimsContext.ExecuteWithoutShims() as a wrapper for the code you don't need shim behavior:
2) Another approach is to set the shim to null, call the original method and restore the shim.
Edit: Obviously the first approach is more concise and readable. SO I prefer it over explicitly declaring shim variable and removing/restoring the shim.