I\'ve a method. which retrieve a document from hard disk. I can\'t test this from unit testing. It always throw an exception invalid null path or something. How to test that
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);
}
}
I was using NSubstitute and I implemented it as below:
var fakeContext = Substitute.For<HttpContextBase>();
fakeContext.Server.MapPath(Arg.Any<string>()).ReturnsForAnyArgs("/set-path/");
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);
}