2009-12-11 69 views
9

我的一些控制器操作需要響應不同的ViewResults,具體取決於它們是否由AJAX請求調用。目前,我正在使用IsAjaxRequest()方法來檢查這一點。在單元測試期間調用此方法時,它會拋出一個ArgumentNullException,因爲缺少HTTP上下文。單元測試控制器調用IsAjaxRequest()的操作

有沒有辦法模擬/僞造這個電話?或者這是我應該以另一種方式檢查AJAX請求的標誌?

+0

SO-如何測試在ASP.NET MVC的AJAX submition? - http://stackoverflow.com/questions/1010900/how-to-test-an-ajax-submition-in-asp-net-mvc – 2009-12-11 19:44:11

回答

12

如果您爲HTTP上下文提供測試雙?會有幫助嗎?

這是可以做到這樣的:

var httpCtxStub = new Mock<HttpContextBase>(); 

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

sut.ControllerContext = controllerCtx; 

其中sut代表被測系統(SUT),即你希望控制器來測試。

本例使用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; 
    } 
}