首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试UrlHelper扩展

单元测试UrlHelper扩展
EN

Stack Overflow用户
提问于 2019-04-30 13:36:45
回答 1查看 1.3K关注 0票数 0

我在我的UrlHelper核心项目中为ASP.NET编写了几种扩展方法。现在我想为他们编写单元测试。但是,我的许多扩展方法都利用了UrlHelper的方法(例如,Action),因此我需要将一个工作的UrlHelper传递给this参数(或者调用方法的工作UrlHelper)。

如何实例化一个工作的UrlHelper?我试过这个:

代码语言:javascript
复制
        Mock<HttpContext> mockHTTPContext = new Mock<HttpContext>();
        Microsoft.AspNetCore.Mvc.ActionContext actionContext = new Microsoft.AspNetCore.Mvc.ActionContext(
            new DefaultHttpContext(), 
            new RouteData(), 
            new ActionDescriptor());
        UrlHelper urlHelper = new UrlHelper(actionContext);

        Guid theGUID = Guid.NewGuid();

        Assert.AreEqual("/Admin/Users/Edit/" + theGUID.ToString(), UrlHelperExtensions.UserEditPage(urlHelper, theGUID));

它与此调用堆栈崩溃(Test method Test.Commons.Admin.UrlHelperTests.URLGeneration threw exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index):

代码语言:javascript
复制
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at Microsoft.AspNetCore.Mvc.Routing.UrlHelper.GetVirtualPathData(String routeName, RouteValueDictionary values)
   at Microsoft.AspNetCore.Mvc.Routing.UrlHelper.Action(UrlActionContext actionContext)
   at Microsoft.AspNetCore.Mvc.UrlHelperExtensions.Action(IUrlHelper helper, String action, String controller, Object values)
   at <MY PROEJCT>.UrlHelperExtensions.UserEditPage(IUrlHelper helper, Guid i_userGUID) 
   at <MY TEST>.URLGeneration()

扩展方法的示例如下:

代码语言:javascript
复制
    public static string UserEditPage(this IUrlHelper helper, Guid i_userGUID)
    {
        return helper.Action(
            nameof(UsersController.EditUser), 
            "Users", 
            new { id = i_userGUID });
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 14:16:06

测试UrlHelper扩展的最佳选择是模拟IUrlHelper,例如使用Moq:

代码语言:javascript
复制
// arrange
UrlActionContext actual = null;
var userId = new Guid("52368a14-23fa-4c7f-a9e9-69b44fafcade");

// prepare action context as necessary
var actionContext = new ActionContext
{
    ActionDescriptor = new ActionDescriptor(),
    RouteData = new RouteData(),
};

// create url helper mock
var urlHelper = new Mock<IUrlHelper>();
urlHelper.SetupGet(h => h.ActionContext).Returns(actionContext);
urlHelper.Setup(h => h.Action(It.IsAny<UrlActionContext>()))
    .Callback((UrlActionContext context) => actual = context);

// act
var result = urlHelper.Object.UserEditPage(userId);

// assert
urlHelper.Verify();
Assert.Equal("EditUser", actual.Action);
Assert.Equal("Users", actual.Controller);
Assert.Null(actual.RouteName);

var values = new RouteValueDictionary(actual.Values);
Assert.Equal(userId, values["id"]);

查看UrlHelperExtensionsTest of ASP.NET核心,以获得一些关于这方面工作细节的想法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55922148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档