2009-06-12 8 views
28

Sto provando a testare alcune logiche dell'applicazione che dipendono dalla proprietà Values ​​in ControllerContext.RouteData.Mocking La classe RouteData in System.Web.Routing per applicazioni MVC

Finora ho

// 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); 

L'unità di test fallisce con: System.ArgumentException: l'installazione non valido su un membro non-override: r => r.Values ​​

Creazione di un falso RouteData non funziona in quanto il costruttore è RouteData (RouteBase, IRouteHandler).

L'importante classe qui è la classe astratta RouteBase che ha il metodo GetRouteData (HttpContextBase) che restituisce un'istanza di RouteData, la classe che sto cercando di simulare. Portami in giro in cerchio!

Qualsiasi aiuto su questo sarebbe molto gradito.

risposta

54

RouteData ha anche un constructor that takes no arguments. Basta crearne uno e aggiungere i valori desiderati. Non c'è bisogno di deriderlo quando puoi crearne uno.

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

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

Lol, grazie. Questo è stato un caso di ripensare al problema da parte mia. Molto semplice. Saluti. – Magpie

2

Sono molto nuovo per TDD in combinazione con oggetti mock, ma una lezione che ho imparato nella fase iniziale da un collega non era quello di deridere i tipi non ti appartengono. Quindi, non provare a deridere RouteData. L'idea era originariamente concepita da Joe Walnes (anche se non riesco a trovare dove l'ha detto).

+2

In realtà uno dei motivi per cui Microsoft ha sviluppato HttpContextBase era tale da poterlo prendere in giro. È un oggetto molto complesso, ma frequentemente utilizzato nei test web. Ci sono alcuni esempi eccellenti di utilizzo di Moq per testare i percorsi in Pro ASP.NET MVC 2. di Steven Sanderson. – KarlZ

+0

Quindi, come posso supporre di testare i miei aiutanti che dipendono da cose come RouteData .. Se dici che non dovrei deridere classi che non possiedo? Non è possibile scrivere i test allora o forse il modo in cui la classe che sto testando deve essere più astratta? Non posso preoccuparmi di cambiare la mia classe ora .. Funziona Ho solo bisogno di unit test per provarlo: D – ppumkin

Problemi correlati