Any alternative for Microsoft Fakes in .NET Core?
Pose works well for this.
using Pose;
Shim dateTimeShim = Shim.Replace(() => DateTime.Now).With(() => new DateTime(2004, 4, 4));
// This block executes immediately
PoseContext.Isolate(() =>
{
// All code that executes within this block
// is isolated and shimmed methods are replaced
// Outputs "4/4/04 12:00:00 AM"
Console.WriteLine(DateTime.Now);
}, dateTimeShim);
Thanks for all the comments, that certainly helped me. I have slightly modified my implementation;
The SystemTime class is now called DateTimeProvider and looks like this:
/// <summary>
/// Used for getting DateTime.Now(), time is changeable for unit testing
/// </summary>
public class DateTimeProvider : IDateTimeProvider
{
/// <summary>
/// Normally this is a pass-through to DateTime.Now, but it can be
/// overridden with SetDateTime( .. ) for testing or debugging.
/// </summary>
private Func<DateTime> _now = () => DateTime.Now;
public Func<DateTime> Now { get => _now; private set => _now = value; }
/// <summary>
/// Set time to return when DateTimeProvider.Now() is called.
/// </summary>
public void SetDateTime(DateTime dateTimeNow)
{
Now = () => dateTimeNow;
}
/// <summary>
/// Resets DateTimeProvider.Now() to return DateTime.Now.
/// </summary>
public void ResetDateTime()
{
Now = () => DateTime.Now;
}
}
I have chosen to make the setter private for Now(). As a result, a developer must explicitly use the method SetDateTime() to change the time. You can also choose to use a auto getter and setter property.
I also added an interface so that the class can be injected:
public interface IDateTimeProvider
{
Func<DateTime> Now { get; }
void SetDateTime(DateTime dateTimeNow);
void ResetDateTime();
}
I hope that someone else will also benefit from this.
I am looking for an alternative to Microsoft Fakes in .NET Core. I know it is no longer supported in .NET Core. I just do not understand why not, I think it was a good solution in certain situations.
Since May 19th 2020 Microsoft Fakes supports .NET Core.
https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes#16.6.0