我尝试在我的ASP.NET MVC 3 Web应用程序中进行一些控制器单元测试。
我的测试代码如下:
[TestMethod]
public void Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
// Arrange.
var newReview = CreateMockReview();
// Act.
var result = _controller.Create(newReview) as RedirectResult;
// Assert.
Assert.IsNotNull(result, "RedirectResult was not returned");
}
很简单。基本上是测试一个[HttpPost]
操作来确保它返回一个RedirectResult
(PRG模式)。我没有使用RedirectToRouteResult
,因为其中没有任何重载支持锚链接。继续往下看。现在,我正在使用Moq来模拟Http Context,包括服务器变量、控制器上下文、会话等等。到目前为止一切都很顺利。
直到我在我的操作方法中遇到了这行代码:
return Redirect(Url.LandingPageWithAnchor(someObject.Uri, review.Uri);
LandingPageWithAnchor
是一个自定义的 HTML 帮助器:
public static string LandingPageWithAnchor(this UrlHelper helper, string uri1, string uri2)
{
const string urlFormat = "{0}#{1}";
return string.Format(urlFormat,
helper.RouteUrl("Landing_Page", new { uri = uri1}),
uri2);
}
基本上,我重定向到另一个页面,这是新内容的“登陆页面”,带有新评论的锚点。很酷。
现在,以前这种方法失败了,因为UrlHelper
为空。
所以在我的模拟中,我做了这个:
controller.Url = new UrlHelper(fakeRequestContext);
由于路由表中没有“Landing_Page”的定义,导致其进一步出现问题并失败了。
所以我知道我需要模拟“某些东西”,但我不确定是:
a)路由表
b)UrlHelper.RouteUrl 方法
c)我编写的 UrlHelper.LandingPageWithAnchor 扩展方法
有人能提供一些指导吗?
编辑
这个特定的路由在一个区域中,因此我尝试在我的单元测试中调用该区域的注册:
AreaRegistration.RegisterAllAreas();
但我遇到了一个 InvalidOperationException
:
在应用程序的预启动初始化阶段无法调用此方法。