Pur*_*ome 27 asp.net-mvc unit-testing controller
我在我的标准上做了一些简单的MS单元测试,没有什么特别的控制器.
当我检查属性时,ViewName从返回的ViewResult对象中,它是""(空的).
我的印象ViewName是它的名称暗示View(正如这篇 关于ASP.NET MVC控制器测试的MS文章所建议的那样).
顺便说一句,当我测试ViewData时,它就在那里并且正确.
这是我的代码......
public ActionResult Index(int? page, string tag)
{
if (page == null || page <= 0)
{
page = 1;
}
var viewData = new IndexViewData
{
... my property setters, etc ...
};
return View(viewData);
}
[TestMethod]
public void Index_Action_Should_Return_Index_View_For_Default_HomePage()
{
// Arrange.
var controller = PostController; // Wrapper, cause I use D.I.
// Act.
ViewResult viewResult = controller.Index(null, null) as ViewResult;
// Assert.
Assert.IsNotNull(viewResult);
Assert.AreEqual("Index", viewResult.ViewName); // This is false/fails.
var indexViewData = viewResult.ViewData.Model as IndexViewData;
Assert.IsNotNull(indexViewData); // This is true.
}
Run Code Online (Sandbox Code Playgroud)
tva*_*son 28
只有在ViewResult中设置ViewName时才会显示ViewName.如果您的视图名称与您的控制器名称匹配,那么我将检查以确保ViewName为null或为空,因为您将不希望在视图上设置名称(IMO)正确的行为.我只检查ViewName是否设置,当我打算要返回的视图与操作不匹配时 - 例如,返回"错误"视图时.
编辑:以下是ViewResultBase.cs中的ExecuteResult的源代码(来自RC1,我的Macintosh上没有RTW的源代码).正如您所看到的,它会检查是否已直接设置ViewName,如果没有,则将其从控制器上下文的路由数据中的操作中提取出来.这只发生在ExecuteResult中,在控制器的操作完成后调用它.
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (String.IsNullOrEmpty(ViewName)) {
ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (View == null) {
result = FindView(context);
View = result.View;
}
ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
View.Render(viewContext, context.HttpContext.Response.Output);
if (result != null) {
result.ViewEngine.ReleaseView(context, View);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7580 次 |
| 最近记录: |