我的一些控制器操作需要響應不同的ViewResults,具體取決於它們是否由AJAX請求調用。目前,我正在使用IsAjaxRequest()
方法來檢查這一點。在單元測試期間調用此方法時,它會拋出一個ArgumentNullException
,因爲缺少HTTP上下文。單元測試控制器調用IsAjaxRequest()的操作
有沒有辦法模擬/僞造這個電話?或者這是我應該以另一種方式檢查AJAX請求的標誌?
我的一些控制器操作需要響應不同的ViewResults,具體取決於它們是否由AJAX請求調用。目前,我正在使用IsAjaxRequest()
方法來檢查這一點。在單元測試期間調用此方法時,它會拋出一個ArgumentNullException
,因爲缺少HTTP上下文。單元測試控制器調用IsAjaxRequest()的操作
有沒有辦法模擬/僞造這個電話?或者這是我應該以另一種方式檢查AJAX請求的標誌?
如果您爲HTTP上下文提供測試雙?會有幫助嗎?
這是可以做到這樣的:
var httpCtxStub = new Mock<HttpContextBase>();
var controllerCtx = new ControllerContext();
controllerCtx.HttpContext = httpCtxStub.Object;
sut.ControllerContext = controllerCtx;
其中sut
代表被測系統(SUT),即你希望控制器來測試。
本例使用Moq。
使用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;
}
}
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