Как сделать unit test для HttpContext.Current.Server.MapPath

Я использую HttpContext.Current.Server.MapPath() в моем методе для извлечения документа.

Чтобы написать unit test для этого метода,

Что мне нужно сделать:

  • App.config
  • В моем методе unit test

Как это сделать?

Я сделал a unit test только для Current.Server.Mappath() не для Path.Combine()

Ответ 1

Это типично для кода, который вызывает статические методы, его очень сложно проверить, сохраняя разделение беспокойства и избегая жесткой связи. Вот общий подход к тестированию и издевательствам "непроверяемого кода": напишите ему "фасадную оболочку".

  • Создайте обертку для этих методов. Простой класс, содержащий методы, называемые разумно, и только делегаты для непроверенных вызовов (обычно статические вызовы)

  • Создайте интерфейс для этого класса-оболочки

  • Вместо прямого вызова непроверенных методов в вашем клиентском коде используйте обертку (вложенную зависимость, используя интерфейс, предоставленный на шаге 2), и вызовите на нее нормальные методы.

  • В вашем модульном тесте обманите оболочку с поведением, которое вы хотите.

Этот подход эффективно уменьшает сцепление и отделяет проблемы, которые необходимо разделить. Конечно, вы по-прежнему не можете проверить поведение самой оболочки, но если она достаточно простая (только делегирование исходным вызовам), то это не так уж большая проблема.

Ответ 2

Наверное, лучшим решением является отказ от использования Server.MapPath: например, вы можете заменить:

Server.MapPath("~/MyFolder/MyFile.dat")

по:

Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"MyFolder\MyFile.dat")

Ответ 3

Это мое предложение:

В вашем приложении:

  {...
         var destinationPath= IOHelper.MapPath(DatafeedFolderName);
    ...
  }

Это код метода справки

public static string MapPath(string subFolder)
                {
                    return HttpContext.Current.IsNull()
                        ? Path.Combine(Directory.GetCurrentDirectory(), subFolder)
                        : HttpContext.Current.Server.MapPath(subFolder);
                }

И unit test может использовать:

 {...
     Assert.True(runtime_path, Directory.GetCurrentDirectory() + "\destimationPath"
...}