Frage

Zunächst einmal bin ich mir bewusst, dass diese Frage zu gefährlich nahe ist: Wie in einem Unit-Test in C # MapPath

Ich hoffe aber, dass es eine andere Lösung. Mein Problem folgt:

In meinem Code habe ich ein Objekt, das validiert werden muss. Ich schaffe Unit-Tests für jede Validierungsmethode um sicherzustellen, dass es richtig ist, zu validieren. Ich schaffe Mock Daten und es in das Objekt geladen wird, dann ist es zu validieren. Das Problem besteht darin, dass innerhalb der Validierung, wenn ein Fehler auftritt, wird ein Fehlercode zugeordnet. Dieser Fehlercode wird verwendet, um aus einer XML-Datei mit Server.MapPath Informationen über den Fehler zu sammeln. Wenn jedoch versucht, die XML-Datei zu erhalten, wird eine Ausnahme ausgelöst wird, um die Datei Bedeutung kann nicht gefunden werden.

Da MapPath in meinem Validierungscode ist, und nicht mein Gerät zu testen, wie bekomme ich meinen Unit-Test den Weg zu erkennen? Ist diese Frage Sinn?

Error Line (In meinem Validation Code nicht meinem Unit-Test):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

Vereinfacht: Die Einheit Test ruft eine Methode in meinem Programm, das Server.MapPath Anrufe, die dann nicht

.
War es hilfreich?

Lösung

Ich würde abstrakt aus dem „Dateiname-Anbieter“ in eine Klasse, die einfach einen Ort gibt, dann können Sie es viel spotten, viel einfacher.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

Dann können Sie entweder die PathProvider Klasse direkt ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

oder verspotten es in Ihren Tests aus:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Andere Tipps

Nach einigen strengen googeln und etwas Hilfe von einem Kollegen kamen wir mit einer einfachen Lösung bis bereits eingebaut in .net

Über den Unit-Tests, die den Validierungsprozess zugreift, fügte ich hinzu:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

Das funktioniert perfekt. Grundsätzlich, wenn der Test aufgerufen wird, lädt es die URL mit dem angegebenen Unit-Test in der Seite zu laden. Da es sich um eine Website, die nun die Unit-Test ruft, wird der Validierungs Zugriff auf Server.MapPath haben. Diese Lösung kann nicht für alle, aber es war perfekt dafür. Dank alle beigetragen.

Versuchen Sie es mit Rhino Mocks oder eine alternative Mockframework die Httpcontext zu verspotten (oder andere abhängige Objekte) Oder Sie könnten Ihre eigenen Mock-Objekte schreiben. Oder schreiben Sie eine MapPathWrapper Klasse, erben von einer MapPathWrapperBase Klasse für Ihre reale Umgebung, dann in für die Komponententests erstellen MockMapPathWrapper Objekt.

Es sollte SO für spöttisch auf viele Beispiele sein.

Hier ist ein Ich fragte:

Wie Rhino Mocks verwenden, um Mock ein Httpcontext .application

UPDATE Ich habe nur Erfahrung tut dies mit der Asp.Net MVC, mit Webforms ich es ImageIN wäre viel schwieriger, wegen des Fehlens einer Httpcontextbase-Klasse.

Ich würde Methoden extrahieren, die Ihre Abhängigkeiten als Argumente annehmen:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

Sie können dann testen Sie die verschiedenen Methoden unabhängig. Zum Beispiel testen, wie ValidatePath() behandelt eine fehlende Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top