【问题标题】:How to Unit/Integrate Test Views to detect breaking changes如何单元/集成测试视图以检测重大更改
【发布时间】:2012-02-12 14:38:50
【问题描述】:

我刚刚开始学习 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。我使用重构来更改名称,并在测试项目中更改了我的单元测试并运行了单元测试。一切都很好。

但是现在当我运行实际应用程序时,我得到了一个错误。基本上,视图的文件夹名称必须从 Reports 更改为 MyReports。我该如何测试这些场景。是否只使用 selenium 之类的功能测试工具?或者我可以用不同的方式编写测试?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 unit-testing tdd automated-tests


    【解决方案1】:

    我认为您不应该/可以做任何事情来使用单元测试来测试它,但是使用 Selenium 进行集成测试是一个很好的方法:

    http://seleniumtoolkit.codeplex.com/

    【讨论】:

      【解决方案2】:

      是的,手动测试或 Selenium 等功能测试工具是找到这些重大更改的唯一方法。

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        相关资源
        最近更新 更多