2009-04-05 6 views
5

ho il seguente Action Method Sto provando a moq test. Si noti lo AcceptVerbs? Devo assicurarmi di provarlo.Come testare un post HTTP con Moq in ASP.NET?

ecco il metodo.

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

Ecco il codice moq ho ...

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

che cosa devo fare per verificare la richiesta era un post?

risposta

9

Il tuo attributo non verrà richiamato quando è in esecuzione come test di unità perché normalmente viene richiamato da ControllerActionInvoker come parte dello "stack" di Mvc. Quello che ho fatto in casi come questo è scrivere un test per assicurarmi che l'attributo corretto sia applicato all'azione con i parametri corretti. Quindi confido che il framework farà il suo lavoro correttamente.

Fare questo richiede riflessione:

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

Quindi quello che stai dicendo è che si sta testando per assicurarsi che avete decorato il metodo di controllo specifico con il verbo .Pubblicare .. al contrario di test che il metodo è stato licenziato su una richiesta è postato su Http (perché questo è il modo in cui è fuori dal campo di applicazione -> è roba di framework) ..? –

+0

corretto. La funzionalità che richiama il filtro è al di fuori dell'ambito del metodo (attivato prima che il metodo venga richiamato), quindi non vedrai mai un POST nel tuo metodo se viene applicato l'attributo corretto. – tvanfosson