Как сделать 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"
...}