2017-08-16 84 views
0

我正在尝试为MVC应用程序编写单元测试。即时通讯试图测试,如果我的控制器返回正确的视图名称。即使设置它后MVC ViewResult.VIewName为空

这是控制器动作IM测试:

public IActionResult Index(string reportcode) 
{ 
    if(string.IsNullOrEmpty(reportcode)) 
      ReportCode = reportcode; 

    ViewBag.GridSource = GetReportData(reportcode); 
    return View("Index"); 
} 

这是我的单元测试:

[Test] 
public void Index_ReturnCorrectView() 
{ 
    var controller = new HomeController(); 
    var result = controller.Index("COMD") as ViewResult; 
    Assert.AreEqual("Index", result.ViewName); 
} 

我从单元测试得到的错误预期“指数”却得到了空。 我做了很多搜索,大多数答案都说应该在返回视图时声明ViewName属性。我尝试了相同的,但它不会仍然工作。

谢谢

+0

无关:你可能真的想'如果(string.IsNullOrEmpty(reportcode)!)' – Andrei

+0

是'result'本身不为空? – Andrei

+0

@Andrei没有结果是一个有效的ViewResult – 7uner

回答

1

documentation for Controller.View()状态:

这种方法View类超负荷返回ViewResult对象 具有空VIEWNAME财产。如果您正在编写针对 控制器操作的单元测试,请考虑 不带字符串视图名称的单元测试的空ViewName属性。

在运行时,如果ViewName属性为空,则使用当前操作 名称替代ViewName属性。

所以,当期待一个与当前动作同名的视图时,我们可以测试它是一个空字符串。

或者,Controller.View(ViewName,Model)方法将设置ViewName。

我控制器的方法

public ActionResult Index() 
    { 
     return View("Index"); 
    } 

测试方法

[TestMethod] 
    public void Index() 
    { 
     // Arrange 
     HomeController controller = new HomeController(); 

     // Act 
     ViewResult result = controller.Index() as ViewResult; 

     // Assert 
     Assert.IsTrue(result.ViewName == "Index"); 
    } 
+0

Controller.View(字符串)正是OP正在使用 – Andrei

+0

@Andrei OP必须使用像Controller.View(“Index”,“COMD”) –

+0

@PowerStar你好,谢谢你的回复。我不确定你的意思是什么Controller.View(“索引”,“COMD”)。这是我应该在索引方法中返回吗?我没有看到它是如何不同于我目前的实施,因为没有必要返回“COMD” – 7uner

相关问题