【发布时间】:2011-08-22 01:43:51
【问题描述】:
尝试在我的 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 上下文,包括服务器变量、控制器上下文、会话等。到目前为止一切顺利。
直到我在我的操作方法中达到这一行:
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:
在应用程序的预启动初始化阶段不能调用此方法。
【问题讨论】:
-
我发现 UrlHelper 很难模拟,至少在 Rhino Mocks 中是这样。我有一个解决方案,但它不是特别优雅,基本上是伪造而不是嘲笑。我有兴趣看看你得到什么答案。如果你没有得到任何东西,请告诉我,我明天会发布一些代码——我现在无法访问它。使用扩展方法会使事情变得复杂,因为您需要有一个帮助器实例来工作,并且您不能将一个实例注入到您的扩展中。
-
你看过这个问题吗?上面有很多肉:stackoverflow.com/questions/674458/…
-
@Matt Greer - 看起来很有用。但同样,我正在使用“区域” - 尝试从我的单元测试中调用该方法时出现错误。我应该把它放在问题中 - 现在编辑......
标签: c# asp.net-mvc unit-testing moq asp.net-mvc-routing