Meine Funktion sieht mehr oder minder so aus:
protected readonly IWebHostEnvironment _env;
public byte[] GetDefaultImage()
{
var webRoot = _env.WebRootPath;
var placeholder = "img/default.png";
var file = System.IO.Path.Combine(webRoot, placeholder);
var userImage = System.IO.File.ReadAllBytes(file);
return userImage;
}
Um dies mit xUnit auch zu testen, gibt es natürlich das Problem, dass webRoot im Testprojekt nicht mehr den richtigen Pfad hat. Praktischerweise kann man IWebHostEnvironment ja mocken. Das hilft aber nur, wenn das MockObjekt dann auch den richtigen Pfad zurückliefert. Ich habe mich dafür entschieden, die default.png in meinem Testprojekt in einen Ordner /Resources/img/default.png zu packen.
Damit sieht mein gemocktes HostEnvironment so aus:
public static IWebHostEnvironment GetMockWebHostEnvironment()
{
var mockEnvironment = new Mock<IWebHostEnvironment>();
var dirName = GetApplicationRoot();
mockEnvironment
.Setup(m => m.WebRootPath)
.Returns(dirName+"\\Resources");
return mockEnvironment.Object;
}
Und der Kern des ganzen ist GetApplicationRoot. Die habe ich hier gefunden und sie sieht so aus:
public static string GetApplicationRoot()
{
var exePath = Path.GetDirectoryName(System.Reflection
.Assembly.GetExecutingAssembly().CodeBase);
Regex appPathMatcher = new Regex(@"(?<!fil)[A-Za-z]:\\+[\S\s]*?(?=\\+bin)");
var appRoot = appPathMatcher.Match(exePath).Value;
return appRoot;
}
Und damit klappt dann auch der Test.