2010-01-29 15 views
6

En mi aplicación Asp.net MVC, tengo dos métodos en un controlador, uno para cuando el usuario llega primero a la vista y otro cuando envían el formulario en dicha vista .mvccontrib auxiliar de prueba y verificación de rutas y parámetros http post

public ActionResult Foo() {} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Foo(string id, Account accountToFoo) {} 

En la segunda acción, hay una carpeta de modelo personalizado que el montaje del objeto de cuenta de que estoy actuando sobre, aunque eso no es realmente importante. Todo esto funciona bien en las pruebas locales en un servidor.

Intentamos ser muy buenos en la escritura de pruebas unitarias para probar todas nuestras diferentes vistas que se enrutan correctamente, incluidas las HTTP POST. Para hacerlo, hemos estado usando el helper de prueba de mvccontrib.

Prueba se han estado súper simple

"~/account/foo/myusername". 
     Route(). 
     ShouldMapTo<AccountController>(c => c.Foo("myusername")); 

Mi pregunta está en vías de POST prueba, ¿Cómo se escribe la lambda que iba a utilizar para verificar el cargo está recibiendo valores precisos, similar a la prueba obtener por encima ?

para un empleo, se ve algo como:

"~/account/foo". 
     WithMethod(HttpVerbs.Post). 
     ShouldMapTo<AccountController>(a => something_something); 

Es la parte de mi something_something lambda que estoy teniendo problemas con el. El uso de valores arbitrarios no funciona ("a => a.Foo (0, nueva cuenta()"). ¿Cómo voy a especificar los valores esperados como parte de la prueba?

EDITAR Tenía la esperanza de que había algo similar a la forma en que Moq tiene lambdas para sentencias como foo.Setup (s => s.Foo (It.IsAny(), It.Is (i => i> 32)) y así sucesivamente. Incluso tengo que explícitamente .. proporcionar los valores, eso es viable - me parece que no puede asimilar a la estructura deseada para pasar esos valores explícitos

+0

¿Alguna vez resolvió este problema? – Paul

+0

No, nunca lo hizo, y me distraí con otras partes de mi nueva aplicación que la unidad de prueba de estas acciones POST particulares se quedó en el camino. Todavía me encantaría saber la mejor manera de acercarse a esto. – bakasan

Respuesta

15

he aquí un ejemplo Asumiendo que tiene la siguiente acción:

public AccountController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Foo(string id) 
    { 
     return View(); 
    } 
} 

Y la siguiente ruta registrada:

RouteTable.Routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "home", action = "index", id = "" } 
); 

podría probar de esta manera:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post); 
routeData.Values["id"] = "123"; 
routeData.ShouldMapTo<AccountController>(c => c.Foo("123")); 

algunas modificaciones podría ser necesario incluir el segundo Account argumento que tiene.

+0

Por extraño que parezca este escenario no funciona para mí. Tengo 2 acciones en el mismo controlador, una etiquetada para HttpGet y otra para HttpPost. Puedo comentar el método HttpPost (el mismo nombre que el HttpGet, pero con una firma diferente) y mi prueba aún se aprobará con el ejemplo que proporcionó en el comentario anterior "Puede probarlo así". Aquí está el enlace a mi pregunta si tiene alguna idea: http: // stackoverflow.com/questions/4157161/issue-with-mvccontrib-testhelper-fluent-route-testing-and-specific-httpverbs –

2

Utilizando la sintaxis mvccontrib ayudante:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null)); 

se pasa null como Foo (ID de cadena, Cuenta accountToFoo) método nunca se ejecuta como parte de la prueba de enrutamiento.

Cuestiones relacionadas