UnitTests: Bild auslesen

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.