Модульное тестирование для Server.MapPath

У меня есть метод. которые извлекают документ с жесткого диска. Я не могу проверить это на модульном тестировании. Он всегда выдает исключение недействительным пустым путём или чем-то еще. Как проверить это. Я временно создал сеанс для unit test. Но я не могу для этого Server.MapPath. Как это сделать?

Ответ 1

Вы можете использовать инъекции зависимостей и абстракцию над Server.MapPath

public interface IPathProvider
{
   string MapPath(string path);
}

И реализация реализации будет:

public class ServerPathProvider : IPathProvider
{
     public string MapPath(string path)
     {
          return HttpContext.Current.Server.MapPath(path);
     }
}

При тестировании:

public class TestPathProvider : IPathProvider
{
    public string MapPath(string path)
    {
        return Path.Combine(@"C:\project\",path);
    }
}

Ответ 2

Если вам нужно проверить устаревший код, который вы не можете или не хотите изменять, вы можете попробовать FakeHttpContext.

Вот как это работает:

var expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "path");
using (new FakeHttpContext())
{
    var mappedPath = Http.Context.Current.Server.MapPath("path");
    Assert.Equal(expectedPath, mappedPath);
}

Ответ 3

Я использовал NSubstitute и реализовал его следующим образом:

 var fakeContext = Substitute.For<HttpContextBase>();
fakeContext.Server.MapPath(Arg.Any<string>()).ReturnsForAnyArgs("/set-path/");