Ich versuche, etwas zu tun Controller Unit-Testing in meiner ASP.NET MVC 3-Webanwendung.
Mein Test läuft folgendermaßen ab:
[TestMethod]
public void Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
// Arrange.
var newReview = CreateMockReview();
// Act.
var result = _controller.Create(newReview) as RedirectResult;
// Assert.
Assert.IsNotNull(result, "RedirectResult was not returned");
}
Ziemlich einfach. Im Grunde testen Sie eine [HttpPost]
Aktion, um sicherzustellen, dass sie eine RedirectResult
(PRG-Muster). Ich verwende nicht RedirectToRouteResult
weil keine der Überladungen Ankerlinks unterstützt. Weiter geht's.
Jetzt benutze ich Moq um den Http-Kontext nachzubilden, einschließlich Servervariablen, Controller-Kontext, Sitzung usw. Alles läuft gut, so weit.
Bis ich diese Zeile in meiner Aktionsmethode erreicht habe:
return Redirect(Url.LandingPageWithAnchor(someObject.Uri, review.Uri);
LandingPageWithAnchor
ist eine benutzerdefinierte HTML-Hilfsfunktion:
public static string LandingPageWithAnchor(this UrlHelper helper, string uri1, string uri2)
{
const string urlFormat = "{0}#{1}";
return string.Format(urlFormat,
helper.RouteUrl("Landing_Page", new { uri = uri1}),
uri2);
}
Im Grunde leite ich auf eine andere Seite weiter, die eine "Landing Page" für neue Inhalte ist, mit einem Anker auf die neue Rezension. Cool.
Diese Methode schlug zuvor fehl, weil UrlHelper
war null.
Also habe ich dies in meinem Spott getan:
controller.Url = new UrlHelper(fakeRequestContext);
Das hat es weitergebracht, aber jetzt schlägt es fehl, weil die Routentabellen keine Definition für "Landing_Page" enthalten.
Ich weiß also, dass ich mich über "etwas" lustig machen muss, aber ich bin nicht sicher, ob es das ist:
a) Die Streckentabellen
b) Die Methode UrlHelper.RouteUrl
c) Die von mir geschriebene Erweiterungsmethode UrlHelper.LandingPageWithAnchor
Kann jemand einen Rat geben?
EDIT
Diese besondere Route befindet sich in einem Bereich also habe ich versucht, die Bereichsregistrierung in meinem Unit-Test aufzurufen:
AreaRegistration.RegisterAllAreas();
Aber ich bekomme eine InvalidOperationException
:
Diese Methode kann nicht während der Initialisierungsphase vor dem Start der Anwendung aufgerufen werden.