Wie vermeide ich HttpContext.Server.MapPath für Unit Testing-Zwecke?
Ich arbeite in einer ASP.net MVC 5-Anwendung. Ich möchte meine Controller-Aktion Unit Test, die so aussieht,
public ActionResult Search()
{
var vm = SetupSearchViewModel();
return View(vm);
}
Alle harte Arbeit erledigt dasSetupSearchViewModel()
-Methode, die selbst ein Orchestrator ist, der viele verschiedene andere Methoden aufruft. Eine davon ist diese @ -Method
private string ExtractJsonFile(string filename)
{
var filePath = HttpContext.Server.MapPath(filename);
var json = System.IO.File.ReadAllText(filePath);
return json;
}
Ich plane, viele Unit-Tests für diese bestimmte Aktion durchzuführen, aber ich beginne mit einem sehr einfachen Unit-Test, der prüft, ob der richtige ActionResult-Typ zurückgegeben wird.
[Test]
public void Search_Get_ReturnsViewResult()
{
// arrange
var performanceController = PerformanceControllerInstance;
// act
var result = performanceController.Search();
//assert
Assert.IsNotNull(result as ViewResult);
}
Der Test schlägt aufgrund des @ feExtractJsonFile
Methode. Es verwendetHttpContext
und das istnull
. Ich benutze Rhino Mocks, um die verschiedenen Klassen zu verspotten.
Was wäre der beste Weg, dies zu testen? Darin indieser Thread vorschlagen wir vermeidenHttpContext.Current
wenn wir unseren Code Unit Tested wollen.
Durch die Art, wie ich versucht habe, den HttpContext zu verspotten und es nicht null gemacht habe, aber dann dasServer
istnull
, Ich kann das wohl auch verspotten (ich weiß noch nicht wie), aber gibt es keinen besseren Weg? Ich habe kein Problem damit, bei Bedarf größere Umgestaltungen vorzunehmen.