2009-06-12 9 views
28

Estoy intentando probar alguna lógica de aplicación que depende de la propiedad Values ​​en ControllerContext.RouteData.Burlarse de la clase RouteData en System.Web.Routing para aplicaciones MVC

Hasta ahora he

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

La unidad de prueba falla con: System.ArgumentException: Configuración no válida en un miembro no reemplazable: r => r.Values ​​

Creación de un RouteData falsos tampoco funciona ya que el constructor es RouteData (RouteBase, IRouteHandler).

La clase importante aquí es la clase abstracta RouteBase que tiene el método GetRouteData (HttpContextBase) que devuelve una instancia de RouteData, la clase que intento falsificar. ¡Me lleva en círculos!

Cualquier ayuda sobre esto sería muy bienvenida.

Respuesta

54

RouteData también tiene un constructor that takes no arguments. Simplemente cree uno y agregue los valores que desee. No hay necesidad de burlarse cuando puedes crear uno.

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

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

Lol, gracias. Este fue un caso de pensar demasiado sobre el problema de mi parte. Muy simple. Aclamaciones. – Magpie

2

soy muy nuevo en TDD en conjunción con los objetos de imitación, sino una lección que aprendí desde el principio de un colega no era para burlarse de tipos que no posee. Por lo tanto, no intentes burlarte de RouteData. La idea fue originalmente concebida por Joe Walnes (aunque no puedo encontrar dónde lo dijo).

+2

En realidad, una de las razones por las que Microsoft desarrolló HttpContextBase fue para poder simularlo. Es un objeto muy complejo, pero se usa con frecuencia en las pruebas web. Hay algunos excelentes ejemplos del uso de Moq para probar tus rutas en Pro ASP.NET MVC 2. de Steven Sanderson 2. – KarlZ

+0

Entonces, ¿cómo debo probar mis ayudantes que dependen de cosas como RouteData ... Si dices que no debo burlarme? clases que no son de mi propiedad? ¿Las pruebas no pueden escribirse entonces o posiblemente de la misma manera que la clase que estoy evaluando debe ser más abstracta? No puedo molestarme en cambiar mi clase ahora ... funciona. Solo necesito pruebas unitarias para probarlo: D – ppumkin

Cuestiones relacionadas