Unit testing for Server.MapPath

Solution 1:

You can use dependancy injection and abstraction over Server.MapPath

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

And production implementation would be:

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

While testing one:

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

Solution 2:

If you need to test legacy code which you can't or don't want to change, you can try FakeHttpContext.

This is how it works:

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