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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage