2009-04-05 17 views
5

Tengo el siguiente Action Method Estoy tratando de moq prueba. Observe el AcceptVerbs? Necesito asegurarme de que estoy probando eso.¿Cómo puedo probar una publicación HTTP con Moq en ASP.NET?

he aquí el método.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Include = "Subject, Content")]Post post, 
    HttpPostedFileBase imageFileName) 
{ 
    ... 
} 

Aquí está el código que tengo moq ...

[TestMethod] 
public void Create_Action_snip_sniop_When_Http_Post_Is_Succesful() 
{ 
    // Arrange. 
    var mock = new Mock<ControllerContext>(); 
    mock.SetupGet(m => m.HttpContext.Request.HttpMethod).Returns("POST"); 

    // Snip some other arrangements. 

    var controller = PostController; 
    controller.ControllerContext = mock.Object; 

    // Act. 
    var viewResult = controller.Create(post, image.Object) as ViewResult; 

    // Assert. 
    Assert.IsNotNull(viewResult); 

    // TODO: Test that the request was an Http-Post. 

¿Qué necesito hacer para verificar la solicitud era un mensaje?

Respuesta

9

Su atributo no se invocará cuando se ejecuta como una prueba de unidad porque normalmente es invocado por ControllerActionInvoker como parte de la "pila" de Mvc. Lo que he hecho en casos como este es escribir una prueba para asegurarme de que se aplica el atributo correcto a la acción con los parámetros correctos. Entonces confío en que el marco hará su trabajo correctamente.

Hacer esto requiere una reflexión:

public void Only_posts_are_allowed_to_my_action() 
{ 
     var method = typeof(MyController).GetMethod("MyAction"); 
     var attribute = method.GetCustomAttributes(typeof(AcceptVerbsAttribute),false) 
          .Cast<AcceptVerbsAttribute>() 
          .SingleOrDefault(); 

     Assert.IsNotNull(attribute); 
     Assert.AreEqual(1, attributes.Count()); 
     Assert.IsTrue(attributes.Contains(HttpVerbs.Post)); 
} 
+0

Así que lo que está diciendo es que se está probando para asegurarse de que ha decorado el método de control específico con el verbo .Post .. a diferencia de las pruebas que el método se activó en una solicitud que está publicada en Http (porque eso está fuera de este ámbito -> es algo de framework) ...? –

+0

Correcto. La funcionalidad que invoca el filtro está fuera del alcance del método (disparada primero antes de invocar el método) por lo que nunca verá un elemento no POST en su método si se aplica el atributo correcto. – tvanfosson

Cuestiones relacionadas