2009-12-11 18 views
9

Alcune delle azioni del mio controller devono rispondere con diversi ViewResults a seconda che siano stati richiamati o meno da una richiesta AJAX. Attualmente, sto usando il metodo IsAjaxRequest() per verificarlo. Quando questo metodo viene chiamato durante un test unitario, genera un ArgumentNullException perché manca il contesto HTTP.Unità di test dell'unità di controllo che chiama IsAjaxRequest()

C'è un modo per simulare/falsificare questa chiamata? O è questo un segno che dovrei controllare per una richiesta AJAX in un altro modo?

+0

SO-Come testare un sottomissione ajax in ASP.NET MVC? - http://stackoverflow.com/questions/1010900/how-to-test-an-ajax-submition-in-asp-net-mvc –

risposta

12

Potrebbe essere d'aiuto fornire un doppio di prova per il contesto HTTP?

questo può essere fatto in questo modo:

var httpCtxStub = new Mock<HttpContextBase>(); 

var controllerCtx = new ControllerContext(); 
controllerCtx.HttpContext = httpCtxStub.Object; 

sut.ControllerContext = controllerCtx; 

dove sut rappresenta il sistema in prova (SUT), vale a dire il controller che si desidera testare.

Questo esempio utilizza Moq.

3

Utilizzando moq biblioteca in progetti di test MVC

[TestClass] 
public class HomeControllerTest 
{ 
    [TestMethod] 
    public void Index() 
    { 
     // Arrange 
     HomeController controller = new HomeController(); 
     controller.injectContext(); 
     // controller.injectContext(ajaxRequest: true); 

     // Act 
     ViewResult result = controller.Index() as ViewResult; 

     // Assert 
     Assert.IsNotNull(result); 
    } 
} 


public static class MvcTestExtensions 
{ 
    public static void injectContext(this ControllerBase controller, bool ajaxRequest = false) 
    { 
     var fakeContext = new Mock<ControllerContext>(); 
     fakeContext.Setup(r => r.HttpContext.Request["X-Requested-With"]) 
      .Returns(ajaxRequest ? "XMLHttpRequest" : ""); 
     controller.ControllerContext = fakeContext.Object; 
    } 
} 
Problemi correlati