2009-12-11 4 views
9

컨트롤러 동작 중 일부는 AJAX 요청에 의해 호출되었는지 여부에 따라 다른 ViewResults로 응답해야합니다. 현재이 방법을 사용하여 IsAjaxRequest() 메서드를 사용하고 있습니다. 단위 테스트 중에이 메서드를 호출하면 HTTP 컨텍스트가 없으므로 ArgumentNullException이 throw됩니다.유닛 테스팅 컨트롤러 IsAjaxRequest()를 호출하는 액션

이 전화를 조롱하거나 가짜로 보내는 방법이 있습니까? 아니면 AJAX 요청을 다른 방법으로 확인해야한다는 신호입니까?

+0

SO-어떻게 ASP.NET MVC에서 아약스 submition를 테스트하려면? - http://stackoverflow.com/questions/1010900/how-to-test-an-ajax-submition-in-asp-net-mvc –

답변

12

HTTP 컨텍스트에 Test Double을 제공하면 도움이 될까요?

는 다음과 같이 수행 할 수 있습니다

sut 테스트 (SUT)에서 시스템을 나타냅니다
var httpCtxStub = new Mock<HttpContextBase>(); 

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

sut.ControllerContext = controllerCtx; 

, 즉 원하는 컨트롤러 테스트 할 수 있습니다.

이 예제에서는 Moq를 사용합니다.

3

MVC 테스트 프로젝트에 moq 라이브러리를 사용하여

[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; 
    } 
} 
관련 문제