2009-06-12 12 views
28

Ich versuche einige Anwendungslogik zu testen, die von der Values-Eigenschaft in ControllerContext.RouteData abhängig ist.Verspotten der RouteData-Klasse in System.Web.Routing für MVC-Anwendungen

Bisher habe ich

// Arrange 
var httpContextMock = new Mock<HttpContextBase>(MockBehavior.Loose); 
var controllerMock = new Mock<ControllerBase>(MockBehavior.Loose); 
var routeDataMock = new Mock<RouteData>(); 

var wantedRouteValues = new Dictionary<string, string>(); 
wantedRouteValues.Add("key1", "value1"); 
var routeValues = new RouteValueDictionary(wantedRouteValues); 

routeDataMock.SetupGet(r => r.Values).Returns(routeValues); <=== Fails here 

var controllerContext = new ControllerContext(httpContextMock.Object, routeDataMock.Object, controllerMock.Object); 

Die Unit-Test mit fehlschlägt: System.ArgumentException: ungültiges Setup auf einem Nicht-overridable Mitglied: r => r.Values ​​

eine gefälschte Routedata Erstellen funktioniert auch nicht, da der Konstruktor RouteData (RouteBase, IRouteHandler) ist.

Die wichtige Klasse hier ist die abstrakte Klasse RouteBase, die die Methode GetRouteData (HttpContextBase) hat, die eine Instanz von RouteData zurückgibt, die Klasse, die ich versuche zu fälschen. Nimm mich im Kreis herum!

Jede Hilfe zu diesem Thema wäre sehr willkommen.

Antwort

54

RouteData hat auch eine constructor that takes no arguments. Erstellen Sie einfach einen und fügen Sie die gewünschten Werte hinzu. Keine Notwendigkeit, es zu verspotten, wenn Sie einen erstellen können.

var routeData = new RouteData(); 
routeData.Values.Add("key1", "value1"); 

var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object); 
+0

Lol, danke. Dies war ein Fall von Überdenken des Problems von meiner Seite. Sehr einfach. Prost. – Magpie

2

Ich bin sehr neu für TDD in Verbindung mit Mock-Objekte, sondern eine Lektion lernte ich früh von einem Kollegen nicht war Typen zu verspotten Sie nicht besitzen. Versuchen Sie also nicht, RouteData zu verspotten. Die Idee wurde ursprünglich von Joe Walnes konzipiert (obwohl ich nicht finden kann, wo er es gesagt hat).

+2

Einer der Gründe, warum Microsoft die HttpContextBase entwickelte, war so, dass Sie sich darüber lustig machen konnten. Das ist ein sehr komplexes Objekt, wird aber häufig im Webtest verwendet. Es gibt einige ausgezeichnete Beispiele für die Verwendung von Moq zum Testen Ihrer Routen in Steven Sandersons Pro ASP.NET MVC 2. – KarlZ

+0

Wie also werde ich meine Helfer testen, die auf Dinge wie RouteData angewiesen sind. Wenn Sie sagen, dass ich nicht spotten soll Klassen, die ich nicht besitze? Tests können dann nicht geschrieben werden oder möglicherweise die Art, wie die Klasse, die ich teste, abstrahiert werden muss? Ich kann mich nicht darum kümmern, meine Klasse zu ändern. Es funktioniert. Ich brauche nur Unit-Tests, um es zu beweisen: D – ppumkin

Verwandte Themen