Любая альтернатива для Microsoft Fakes в .NET Core? - PullRequest
0 голосов
/ 25 сентября 2018

Я ищу альтернативу Microsoft Fakes в .NET Core.Я знаю, что больше не поддерживается в .NET Core.Я просто не понимаю, почему нет, я думаю, что это было хорошее решение в определенных ситуациях.

Моя проблема в том, что я хочу издеваться над DateTime.Now.Ранее вы могли сделать это с помощью следующего кода:

System.Fakes.ShimDateTime.NowGet = () => 
{ 
   return new DateTime(2000, 1, 1); 
};

Это описано в документации Microsoft, см. Ссылку для получения дополнительной информации: https://docs.microsoft.com/en-us/visualstudio/test/using-shims-to-isolate-your-application-from-other-assemblies-for-unit-testing?view=vs-2017

Пока я решил эту проблему, создавоболочка для DateTime, которая выглядит следующим образом:

/// <summary>
/// Used for getting DateTime.Now(), time is changeable for unit testing
/// </summary>
public static class SystemTime
{
   /// <summary> 
   /// Normally this is a pass-through to DateTime.Now, but it can be 
   /// overridden with SetDateTime( .. ) for testing or debugging.
   /// </summary>
   public static Func<DateTime> Now = () => DateTime.Now;

   /// <summary> 
   /// Set time to return when SystemTime.Now() is called.
   /// </summary>
   public static void SetDateTime(DateTime dateTimeNow)
   {
      Now = () =>  dateTimeNow;
   }

   /// <summary> 
   /// Resets SystemTime.Now() to return DateTime.Now.
   /// </summary>
   public static void ResetDateTime()
   {
       Now = () => DateTime.Now;
   }
}

Я обязан этим решением к следующему сообщению StackOverflow: Модульное тестирование: DateTime.Now

Но япока не удовлетворен этим решением, потому что чувствую, что должен настроить свою реализацию для своего тестирования.Я не думаю, что это желательно.

Я надеюсь, что кто-то может помочь мне с этим, заранее спасибо за усилия.

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Поза хорошо подходит для этого.

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);
0 голосов
/ 28 сентября 2018

Спасибо за все комментарии, которые, безусловно, помогли мне.Я немного изменил свою реализацию;

Класс SystemTime теперь называется DateTimeProvider и выглядит следующим образом:

/// <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;
   }
}

Я решил сделать установщик закрытым для Now ().В результате разработчик должен явно использовать метод SetDateTime (), чтобы изменить время.Вы также можете выбрать использование свойства автоматического получения и установки.

Я также добавил интерфейс, позволяющий вводить класс:

public interface IDateTimeProvider
{
    Func<DateTime> Now { get; }
    void SetDateTime(DateTime dateTimeNow);
    void ResetDateTime();
}

Я надеюсь, что кто-то еще также получит пользуэто.

...