using System;
using System.Collections.Specialized;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.SessionState;
namespace MvcFakes
{
public class FakeControllerContext : ControllerContext
{
public FakeControllerContext(ControllerBase controller)
: this(controller, null, null, null, null, null, null)
{
}
public FakeControllerContext(ControllerBase controller, HttpCookieCollection cookies)
: this(controller, null, null, null, null, cookies, null)
{
}
public FakeControllerContext(ControllerBase controller, SessionStateItemCollection sessionItems)
: this(controller, null, null, null, null, null, sessionItems)
{
}
public FakeControllerContext(ControllerBase controller, NameValueCollection formParams)
: this(controller, null, null, formParams, null, null, null)
{
}
public FakeControllerContext(ControllerBase controller, NameValueCollection formParams, NameValueCollection queryStringParams)
: this(controller, null, null, formParams, queryStringParams, null, null)
{
}
public FakeControllerContext(ControllerBase controller, string userName)
: this(controller, userName, null, null, null, null, null)
{
}
public FakeControllerContext(ControllerBase controller, string userName, string[] roles)
: this(controller, userName, roles, null, null, null, null)
{
}
public FakeControllerContext
(
ControllerBase controller,
string userName,
string[] roles,
NameValueCollection formParams,
NameValueCollection queryStringParams,
HttpCookieCollection cookies,
SessionStateItemCollection sessionItems
)
: base(new FakeHttpContext(new FakePrincipal(new FakeIdentity(userName), roles), formParams, queryStringParams, cookies, sessionItems),
new RouteData(), controller)
{ }
}
}
下面是测试类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MVCTest;
using MVCTest.Controllers;
using MvcFakes;
using System.Web.SessionState;
using System.Web;
using System.Collections.Specialized;
namespace MVCTest.Tests.Controllers
{
/// <summary>
/// Summary description for HomeControllerTest
/// </summary>
[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void TestSession()
{
// Arrange
HomeController controller = new HomeController();
var sessionItems = new SessionStateItemCollection();
sessionItems["CurrentCulture"] = "zh-CN";
controller.ControllerContext = new FakeControllerContext(controller, sessionItems);
// Act
ViewResult result = controller.TestSession() as ViewResult;
// Assert
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("Home Page", viewData["Title"]);
Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]);
Assert.AreEqual(sessionItems["name"], "Jack Wang");
Assert.AreEqual("zh-CN", viewData["CurrentCulture"]);
}
[TestMethod]
public void TestFakeFormParams()
{
var controller = new HomeController();
var formParams = new NameValueCollection { { "Name", "Jack" }, { "Age", "28" } };
controller.ControllerContext = new FakeControllerContext(controller, formParams);
var result = controller.TestForm() as ViewResult;
Assert.AreEqual("Jack", result.ViewData["Name"]);
Assert.AreEqual("28", result.ViewData["Age"]);
Assert.AreEqual(formParams.Count, result.ViewData["count"]);
}
[TestMethod]
public void TestFakeQueryStringParams()
{
var controller = new HomeController();
var queryStringParams = new NameValueCollection { { "PageSize", "10" }, { "CurrentPage", "5" } };
controller.ControllerContext = new FakeControllerContext(controller, null, queryStringParams);
var result = controller.Details() as ViewResult;
Assert.AreEqual("10", result.ViewData["PageSize"]);
Assert.AreEqual("5", result.ViewData["CurrentPage"]);
Assert.AreEqual(queryStringParams.Count, result.ViewData["count"]);
}
[TestMethod]
public void TestFakeUser()
{
var controller = new HomeController();
controller.ControllerContext = new FakeControllerContext(controller, "Jack Wang");
var result = controller.TestLogin() as ActionResult;
Assert.IsInstanceOfType(result, typeof(ViewResult));
ViewDataDictionary viewData = ((ViewResult)result).ViewData;
Assert.AreEqual("Jack Wang", viewData["userName"]);
controller.ControllerContext = new FakeControllerContext(controller);
result = controller.TestLogin() as ActionResult;
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}
[TestMethod]
public void TestFakeUserRoles()
{
var controller = new HomeController();
controller.ControllerContext = new FakeControllerContext(controller, "Jack Wang", new string[] { "Admin" });
var result = controller.Admin() as ActionResult;
Assert.IsInstanceOfType(result, typeof(ViewResult));
controller.ControllerContext = new FakeControllerContext(controller);
result = controller.Admin() as ActionResult;
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}
[TestMethod]
public void TestCookies()
{
var controller = new HomeController();
var cookies = new HttpCookieCollection();
cookies.Add(new HttpCookie("key", "a"));
controller.ControllerContext = new FakeControllerContext(controller, cookies);
var result = controller.TestCookie() as ViewResult;
Assert.AreEqual("a", result.ViewData["key"]);
}
}
}
测试完全通过
总结: 个人感觉ASP.NET MVC的测试是很不友好的,和ruby on rails相比,在测试这一块还有很大的距离,希望正式版里这一块能够加强
王德水 写于2008-01-05 00:30分
本文源码下载