2012-02-12 89 views
1

我刚开始学习asp.net mvc,其中一个原因主要原因是迁移到TDD。如何对测试视图进行单元/集成以检测突发更改

我正在写一个有报告的小型仪表板应用程序。在这个应用程序中,我有一个名为ReportsController的主控制器,它现在只有一个方法,GetReport接受查询并在查询满足特定条件时返回视图,否则返回错误消息。

[HttpGet] 
public ActionResult GetReport(string query) 
{  
    //calls the QueueRep and gets back DataTable 
    ReportQuery reportQuery = new ReportQuery(query); 
    if (reportQuery.IsValidQuery) 
    { 
     queryRepository.ExecuteReportQuery(ref reportQuery);     
    } 
    else 
    { 
     return View("Error"); 
    }   
    ViewData.Add("ResultDataTable",reportQuery.ResultDataTable); 

    return View(); 

}

我写了2个单元测试具体步骤如下

public void GetReport_Should_Return_Error_View_For_Malicious_Query() 
{ 
    //Arrange 
    string query = "drop table userInfo"; 
    var controller = CreateReportsController(query); 

    //Act 
    var result = controller.GetReport(query) as ViewResult; 

    //Assert 
    Assert.AreEqual(result.ViewName, "Error"); 

} 

[Test] 
public void GetReport_Should_Return_View_With_DataTable_For_Correct_Query() 
{ 
    //Arrange 
    StringBuilder sb = new StringBuilder(); 

    sb.Append("SELECT Year(CreatedOn) as Year, Month(CreatedOn) as Month, Count(CREATEDON) as NewEmployers"); 
    sb.Append("FROM dbo.UserInfo WHERE DefaultPurpose = 1 GROUP BY Year(CreatedOn), Month(CreatedOn)"); 

    string query = sb.ToString(); 

    var controller = CreateReportsController(query); 

    //Act 

    var result = controller.GetReport(query) as ViewResult; 

    //Assert 

    Assert.IsTrue(result.ViewData.ContainsKey("ResultDataTable")); 
    Assert.IsTrue(result.ViewData["ResultDataTable"].GetType() == typeof(System.Data.DataTable)); 

} 

现在,由于与SSRS,服务器冲突/报告指着SSRS,而不是报告控制器,以便我将ReportsController的名称更改为MyReportsController。我使用重构进行名称更改,并在测试项目中更改我的单元测试,并运行单元测试。一切安好。

但是现在当我运行实际的应用程序时,出现错误。基本上,必须将视图的文件夹名称从“报告”更改为“MyReports”。我如何测试这些场景。仅使用硒等功能测试工具?或者我可以用不同的方式写我的测试?

回答

1

是,手动测试或功能测试工具(如Selenium)是找到这些重大变化的唯一方法。

原因是因为在单元测试中,您只是测试代码的小小部分。所以测试一个控制器的动作方法非常棒!在那个测试中,你需要记住你测试自己的代码而不是asp.net和/或mvc框架。现在,为了渲染视图结果,这是在你的动作方法之外处理的。其次,我们假设渲染逻辑(如何渲染)已经由微软测试过,所以我们不想浪费时间测试。

所以这意味着我们需要在单个测试中将独立模块连接在一起。当我们有2+模块或区域等进行测试时,我们突然跳出单元测试并进入手动或功能测试。