2009-04-05 4 views
5

J'ai le suivant Action Method J'essaie de moq test. Remarquez le AcceptVerbs? Je dois m'assurer que je teste ça.Comment tester un HTTP-Post avec Moq dans ASP.NET?

Voici la méthode.

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

est ici le code moq j'ai ...

[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. 

Que dois-je faire pour vérifier la demande était un poste?

Répondre

9

Votre attribut ne sera pas appelé lors de l'exécution en tant que test unitaire car il est normalement appelé par le ControllerActionInvoker dans le cadre de la "pile" Mvc. Ce que j'ai fait dans de tels cas est d'écrire un test pour m'assurer que l'attribut correct est appliqué à l'action avec les paramètres corrects. Ensuite, je crois que le cadre fera son travail correctement.

Faire cela nécessite une réflexion:

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

Alors ce que vous dites est que vous testez pour vous assurer que vous avez décoré la méthode du contrôleur spécifique avec le verbe .Passez .. par opposition aux tests qui la méthode a été lancée sur une demande est Http-posté (parce que c'est plomberie en dehors de cette portée -> c'est des trucs de cadre) ..? –

+0

Correct. La fonctionnalité qui invoque le filtre est en dehors de la portée de la méthode (déclenchée avant que la méthode ne soit invoquée). Ainsi, vous ne verrez jamais de non-POST dans votre méthode si l'attribut correct est appliqué. – tvanfosson