2 Stimmen

Wie man eine Einheitstest für HttpContext.Current.Server.MapPath durchführt

Ich verwende HttpContext.Current.Server.MapPath() in meiner Methode, um ein Dokument abzurufen.

Um einen Unit-Test für diese Methode zu schreiben,

Was muss ich in:

  1. App.config
  2. In meiner Unit-Test-Methode

Wie kann ich das mocken?

Ich möchte nur einen Unit-Test für Current.Server.Mappath() durchführen, nicht für Path.Combine()

9voto

Joe Punkte 117971

Die beste Lösung ist wahrscheinlich, Server.MapPath zu vermeiden: Zum Beispiel, können Sie ersetzen:

Server.MapPath("~/MyFolder/MyFile.dat")

durch:

Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"MyFolder\MyFile.dat")

4voto

Guillaume Punkte 22444

Dies ist typisch für Code, der statische Methoden aufruft. Es ist sehr schwierig zu testen, während die Trennung der Anliegen und das Vermeiden von enger Kopplung beibehalten werden. Hier ist ein generischer Ansatz, um "nicht testbaren Code" zu testen und zu mocken: Schreiben Sie einen "Fassaden-Wrapper" dafür.

  • Erstellen Sie einen Wrapper für diese Methoden. Eine einfache Klasse, die sinnvoll benannte Methoden enthält und nur an die nicht testbaren Aufrufe weiterleitet (typischerweise statische Aufrufe).

  • Erstellen Sie eine Schnittstelle für diese Wrapper-Klasse.

  • Statt die nicht testbaren Methoden direkt im Client-Code aufzurufen, verwenden Sie den Wrapper (der mithilfe der in Schritt 2 bereitgestellten Schnittstelle dependency-injected wird) und rufen Sie normale Methoden darauf auf.

  • In Ihrem Unit-Test mocken Sie den Wrapper mit dem gewünschten Verhalten.

Dieser Ansatz reduziert effektiv die Kopplung und trennt die Anliegen, die getrennt werden müssen. Natürlich können Sie das Verhalten des Wrappers selbst immer noch nicht testen, aber wenn es einfach genug ist (nur Weiterleitung an die Originalaufrufe), dann ist das kein so großes Problem.

0voto

Roi Shabtai Punkte 2772

Das ist mein Vorschlag:

In deiner App:

  {...
         var destinationPath= IOHelper.MapPath(DatafeedFolderName);
    ...
  }

Das ist der Code der Hilfsmethode

public static string MapPath(string subFolder)
                {
                    return HttpContext.Current.IsNull()
                        ? Path.Combine(Directory.GetCurrentDirectory(), subFolder)
                        : HttpContext.Current.Server.MapPath(subFolder);
                }

Und der Unit-Test kann verwenden:

 {...
     Assert.True(runtime_path, Directory.GetCurrentDirectory() + "\destimationPath"
...}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X