我正在尝试创建单元测试,以确保我的UrlHelper扩展方法有效?有人知道怎么做吗?我使用的是MVC1.0和MvcContrib。我可以测试路由,但不能像这样测试代码:
public static string MoreFloorplans(this UrlHelper urlHelper, long productID, int pageIndex)
{
return urlHelper.Action<CatalogController>(x => x.GetRelatedProducts(productID, pageIndex));
}发布于 2010-07-23 20:56:00
我听从了宇航员和斯科特·H的指示,但这花了我一些时间。我最终得到了类似这样的东西。
public UrlHelper GetUrlHelper(
string fileName = "/",
string url="http://localhost",
string queryString="")
{
// Use routes from actual app
var routeCollection = new RouteCollection();
MvcApplication.RegisterRoutes(routeCollection);
//Make a request context
var request = new HttpRequest(fileName, url, queryString);
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);
var httpContextBase = new HttpContextWrapper(httpContext);
var requestContext = new RequestContext(httpContextBase, new RouteData());
// Make the UrlHelper with empty route data
return new UrlHelper(requestContext, routeCollection);
}
public void MoreFloorplans_ReturnsExpectedUrl()
{
var urlHelper = GetUrlHelper();
var actualResult = urlHelper.MoreFloorPlans(1,2);
Assert.AreEqual("/MoreFloorPlans/1/2", actualResult);
}请注意,您应该测试扩展方法,而不是UrlHelper本身,因此在RequestContext中设置RouteData可能超出了范围。
发布于 2010-04-20 05:05:49
为了创建UrlHelper,您需要一个RequestContext。为了创建一个正常运行的RequestContext,您需要一个HttpContextBase和一个RouteData。第二个是RouteData,构造起来应该很简单。HttpContextBase,你不得不嘲笑它。
为此,我建议你看看Scott H的MvcMockHelpers。其中的一部分有点陈旧,但我认为它对于这个特定的测试已经足够好了--您真正需要的就是FakeHttpContext方法及其依赖项。如果你拿起这个库,你的代码看起来会像这样:
[TestMethod]
public void Can_write_more_floorplans()
{
const long productID = 12345;
const int pageIndex = 10;
var httpContext = FakeHttpContext(); // From the MvcMockHelpers
var routeData = new RouteData();
var requestContext = new RequestContext(httpContext, routeData);
var urlHelper = new UrlHelper(requestContext);
string floorplans = MoreFloorplans(urlHelper, productID, pageIndex);
Assert.AreEqual(some_string, floorplans);
}我知道您说您正在尝试使用MvcContrib TestHelper项目,但据我所知,该库主要用于测试控制器。我不确定它是否真的足够细粒度来测试较低级别的组件。无论如何,您并不真正需要其中的所有内容;您所需要的只是一个RequestContext。
https://stackoverflow.com/questions/2670720
复制相似问题