在ASP.NET MVC中測試Controller時,常常需要在Controller中訪問上下文,比方說查詢字串或者form中的內容,而我們測試的時候一般不是在web運行環境下的,所以我們需要做些工作去類比上下文。
Controller中代碼如下
public ActionResult Index()
{
ViewData["Message"] = Request.QueryString["lfm"];
return View();
}
測試寫法如下:
代碼
[TestMethod]
public void Index()
{
HomeController controller = new HomeController();
var httpContext = new Mock<HttpContextBase>();
var request=new Mock<HttpRequestBase>();
NameValueCollection queryString = new NameValueCollection();
queryString.Add("lfm", "lfm");
request.Setup(r => r.QueryString).Returns(queryString);
httpContext.Setup(ht => ht.Request).Returns(request.Object);
ControllerContext controllerContext = new ControllerContext();
controllerContext.HttpContext = httpContext.Object;
controller.ControllerContext = controllerContext;
ViewResult result = controller.Index() as ViewResult;
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("lfm", viewData["Message"]);
}
這裡用到了Mock可以參考:
MoQ(基於.net3.5,c#3.0的mock架構)簡單介紹
如果是form稍作修改即可:
public ActionResult About()
{
ViewData["Message"] = Request.Form["lfm"];
return View();
}
測試代碼:
代碼
[TestMethod]
public void About()
{
// Arrange
HomeController controller = new HomeController();
var httpContext = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
NameValueCollection queryString = new NameValueCollection();
queryString.Add("lfm", "lfm");
request.Setup(r => r.Form).Returns(queryString);
httpContext.Setup(ht => ht.Request).Returns(request.Object);
ControllerContext controllerContext = new ControllerContext();
controllerContext.HttpContext = httpContext.Object;
controller.ControllerContext = controllerContext;
// Act
ViewResult result = controller.About() as ViewResult;
// Assert
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("lfm", viewData["Message"]);
}