1

这是控制器的返回语句:

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

所以,在我的测试方法中,我需要分配控制器的(sut)UrlHelper,这样我就不会得到空引用异常。我正在使用 FakeItEasy 来模拟 HttpContext:

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

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

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 在测试中将正确的值吐回给我?

谢谢!麦克风

4

1 回答 1

2

如果我正确理解您的问题,您想测试从返回 RedirectResult 返回的 url。

你可以简单地做这样的事情:

var result = (RedirectResult)aec.Result;

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

于 2014-02-27T00:38:20.713 回答