Unit-Test für controller an ASP.NET MVC 2 mit RedirectToAction
Ich habe einen controller, implementiert ein einfaches Add-operation auf ein Element und leitet auf die Seite mit den Details:
[HttpPost]
public ActionResult Add(Thing thing)
{
//... do validation, db stuff ...
return this.RedirectToAction<c => c.Details(thing.Id));
}
Diese funktioniert Super (mit der RedirectToAction von MvcContrib Montage).
Wenn ich unit-Tests diese Methode, die ich für den Zugriff auf das ViewData, der zurückgegeben wird, von den Details der Aktion (also ich kann mit der neu eingefügte Sache, die primary key-und zu beweisen, es ist jetzt in der Datenbank).
Den test:
var result = controller.Add(thing);
Aber das Ergebnis hier ist der Typ: System.Web.Mvc.RedirectToRouteResult
(das ist ein System.Web.Mvc.ActionResult
). Es nicht noch nicht ausgeführt, die Details der Methode.
Habe ich versucht, Sie anzurufen ExecuteResult
auf das zurückgegebene Objekt übergeben verspottet bis ControllerContext
aber der Rahmen war nicht glücklich mit dem Mangel an detail in der verspottet Objekt.
Könnte ich versuchen, die Füllung in den details, etc, etc, aber dann ist mein test-code ist viel länger als der code, den ich Teste und ich habe das Gefühl ich brauche unit-tests für die unit-tests!
Bin ich etwas fehlt in der testing-Philosophie? Wie kann ich testen diese Aktion, wenn ich nicht bekommen kann auf die zurückgegebenen Zustand?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mit MVC2-RC2 im moment und die Antwort von rmacfie hat nicht ganz so funktioniert für mich, aber hast mich auf die richtige Spur.
Recht oder zu Unrecht habe ich es geschafft, dies zu tun in meinem test statt:
Nicht sicher, ob dies jemandem helfen, aber vielleicht sparen Sie 10 Minuten.
RedirectToAction("Details", "Person", {personId=123})
können Sie überprüfenpersonId
:Assert.AreEqual(123, actionResult.RouteValues["personId"])
Gibt es MVC Contrib TestHelper, die sind fantastisch zum testen die meisten ActionResult
Du kannst es hier bekommen:
http://mvccontrib.codeplex.com/wikipage?title=TestHelper
Hier ist ein Beispiel für die syntax:
Um zu testen, ob die Daten erfolgreich gespeichert worden ist, sollten Sie vielleicht Fragen Sie Ihren Datenbank direkt, ich weiß nicht, wenn Sie über einen ORM oder etwas, aber Sie sollten etwas tun, um die Letzte eingefügte Element in der Datenbank, dann vergleichen Sie mit dem Wert, den Sie zur Verfügung gestellt, um Ihre Hinzufügen ActionResult und sehen, ob das ok ist.
Ich glaube nicht, dass die Prüfung Ihrer Angaben ActionResult, um zu sehen, wenn Ihre Daten persistiert, ist der richtige Ansatz. Wäre das nicht eine unit-test, eher eine Funktionsprüfung.
Aber Sie sollten auch unit-test-Ihre Details-Methode, um sicherzustellen, dass Ihre viewdata Objekt ist gefüllt mit den richtigen Daten aus Ihrer Datenbank.
Scheinen Sie zu tun, viel zu viel für einen unit-test. Die Validierung und Daten-Zugriff wäre in der Regel durch Dienstleistungen, die Sie nennen, vom controller-Aktion. Sie verspotten diejenigen, die Dienstleistungen und nur test, dass Sie genannt wurden, richtig.
Etwas wie dies (mit ungefähren syntax für Rhino.Mocks & NUnit):
Habe ich eine statische Hilfsmethode, die überprüft Umleitung.
Dann erstellen Sie eine Umleitung zu testen ist sehr einfach.