需要单元测试一个控制器的ActionMethod,它返回一个RedirectResult和一个锚标签

时间:2013-09-12 14:15:44

标签: asp.net-mvc unit-testing nunit fakeiteasy urlhelper

这是控制器的return语句:

var url = Url.Action("method", "controller", new { id = id }) + "#anchor-tag";
return new RedirectResult(url);

所以,在我的测试方法中,我需要分配Controller的(sut)UrlHelper,所以我没有得到空引用异常。我正在使用FakeItEasy来模拟HttpContext:

sut.Url = new UrlHelper(new RequestContext(A.Fake<HttpContextBase>(), new RouteData()), new RouteCollection());

这似乎工作正常,但是当我想证明控制器的action方法已经重定向到正确的方法和控制器时:

var redirectResult = sut.DoSomething(input);

当控制器操作返回RedirectToRouteResult时,我无法提取RouteValues。又名:

Assert.That(redirectResult.RouteValues["id"], Is.EqualTo(Id));

b / c RedirectResult不允许我访问这些变量。另外,如果我尝试施放它:

var redirectResult = (RedirectToRouteResult)sut.DoSomething(input);

我收到了投射错误。

我需要能够测试控制器是否重定向到适当的位置,但是我不能这样做b / c Url.Action(...)必须在内部与其他项目一起工作,例如RouteData,RouteCollection等。 ..

任何人都知道如何使用ControllerContext在我的测试中预先填充我需要的“路径”数据:

sut.ControllerContext = new ControllerContext(requestContext, sut);

为了让Url.Action在测试中将正确的值吐回给我?

谢谢! 麦克

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你想测试从返回的RedirectResult返回的网址。

您可以简单地执行以下操作:

var result =(RedirectResult)aec.Result;

然后result.Url.AbsoluteURI包含您可以解析的字符串值