如何模拟Url.Action

szp*_*pic 2 c# asp.net-mvc unit-testing moq

我尝试对单元测试返回的方法:

return Json(new { ok = true, newurl = Url.Action("Index") });
Run Code Online (Sandbox Code Playgroud)

但是这一行抛出NullReferenceException是由这部分收益引起的:

newurl = Url.Action("Index")
Run Code Online (Sandbox Code Playgroud)

我试图做一些事情:

Request.SetupGet(x => x.Url).Returns(// Data here);
Run Code Online (Sandbox Code Playgroud)

没有任何影响。

你能建议我任何解决方案吗?

Ben*_*ter 5

这是UrlHelper使用NSubstitute模拟的方法。与其他模拟库非常相似:

UrlHelper Url { get; set; }

[TestFixtureSetUp]
public void FixtureSetUp()
{
    var routes = new RouteCollection();
    RouteConfig.RegisterRoutes(routes);

    var httpContext = Substitute.For<HttpContextBase>();
    httpContext.Response.ApplyAppPathModifier(Arg.Any<string>())
        .Returns(ctx => ctx.Arg<string>());
    var requestContext = new RequestContext(httpContext, new RouteData());
    Url = new UrlHelper(requestContext, routes);
}

// Pages

[Test]
public void HomePage()
{
    Url.Action("home", "pages").ShouldEqual("/");
}

[Test]
public void PageDetails()
{
    Url.Action("details", "pages", new { slug = "contact" }).ShouldEqual("/pages/contact");
}
Run Code Online (Sandbox Code Playgroud)