MVC专题 专题
您的位置:csharp > MVC专题专题 > ASP.Net MVC单元测试
ASP.Net MVC单元测试
作者:--    发布时间:2019-11-19

在计算机编程中,单元测试是一种软件测试方法,通过这种方法对各个源代码单元进行测试,以确定它们是否适合使用。 换句话说,这是一个软件开发过程,在这个过程中,应用程序中最小的可测试部分(称为单元)被单独和独立地审查以便正确执行和操作。

在程序编程中,一个单元可以是一个完整的模块,但更常见的是一个单独的功能或过程。 在面向对象编程中,一个单元通常是一个完整的接口,比如一个类,但可能是一个单独的方法。

单元测试通常是自动的,但也可以手动完成。

单元测试的目标

单元测试的主要目标是在应用程序中使用最小的可测试软件,并确定其行为是否与期望的完全一致。每个单元在将它们集成到模块之前分别进行测试,以测试模块之间的接口。

我们来看一个单元测试的简单例子,在这个例子中使用单元测试选项来创建一个新的asp.net mvc应用程序。

第1步 - 打开visual studio,然后单击:文件 -> 新建 -> 项目 菜单选项。一个新的项目对话框打开。
第2步 - 在左侧窗格中,选择:模板 -> visual c# -> web
第3步 - 在中间窗格中,选择:asp.net web应用程序

第4步 - 在名称字段中输入项目名称为:mvcunittesting,然后单击确定 继续。
然后将看到下面的对话框,要求设置asp.net项目的初始内容。

第5步 - 选择mvc作为模板,不要忘记选中对话框底部的添加单元测试复选框。也可以更改测试项目名称,但在此示例中,我们将其保持原样,因为它是默认名称。

项目由visual studio创建后,将在“解决方案资源管理器”窗口中看到许多文件和文件夹。

第6步 - 可以看到在解决方案资源管理器中有两个项目。 一个是asp.net web项目,另一个是单元测试项目。

第7步 - 运行这个应用程序,会看到下面的输出。

如上图所示,导航栏上有“首页”,“关于”和“联系人”按钮。这里点击“关于”链接,会看到下面的视图。

现在展开mvcunittestingdemo 项目,将看到 controllers 文件夹下的homecontroller.cs 文件。

homecontroller 包含三个操作方法,如下面的代码所示。

using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;

namespace mvcunittesting.controllers
{
    public class homecontroller : controller
    {
        public actionresult index()
        {
            return view();
        }

        public actionresult about()
        {
            viewbag.message = "your application description page.";

            return view();
        }

        public actionresult contact()
        {
            viewbag.message = "your contact page.";

            return view();
        }
    }
}

展开mvcunittestingdemo.tests 项目,controllers文件夹下的homecontrollertest.cs文件。

在这个homecontrollertest类中有三个方法,如下面的代码所示。

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.web.mvc;
using microsoft.visualstudio.testtools.unittesting;
using mvcunittesting;
using mvcunittesting.controllers;

namespace mvcunittesting.tests.controllers
{
    [testclass]
    public class homecontrollertest
    {
        [testmethod]
        public void index()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.index() as viewresult;

            // assert
            assert.isnotnull(result);
        }

        [testmethod]
        public void about()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.about() as viewresult;

            // assert
            assert.areequal("your application description page.", result.viewbag.message);
        }

        [testmethod]
        public void contact()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.contact() as viewresult;

            // assert
            assert.isnotnull(result);
        }
    }
}

这三个方法将测试index,about和contact操作方法是否正常工作。要测试这三个操作方法,请转到测试 菜单。选择:运行 -> 所有测试 项来测试这些操作方法。

现在会看到左边的测试资源管理器,可以看到所有的测试都通过了。再添加一个动作方法,它用于列出所有的员工。首先,需要在models 文件夹中添加一个employee类。
以下是employee类的实现 -

using system;
using system.collections.generic;
using system.linq;
using system.web;

namespace mvcunittesting.models
{
    public class employee
    {
        public int id { get; set; }
        public string name { get; set; }
        public datetime joiningdate { get; set; }
        public int age { get; set; }
    }
}

添加employeecontroller 。 右键单击解决方案资源管理器 中的controllers 文件夹,然后选择:添加 -> 控制器 ,它将显示“添加基架”对话框。选择:mvc 5控制器 - 空 选项,然后点击“添加” 按钮,如下图所示 -

添加控制器对话框将出现。将名称设置为:employeecontroller,然后单击“添加”按钮。

controllers 文件夹中看到一个新的 c# 文件 -employeecontroller.cs,该文件夹在visual studio中打开并进行编辑。这里使用下面的代码更新employeecontroller。

using mvcunittesting.models;
using system;
using system.collections.generic;
using system.linq;

using system.web;
using system.web.mvc;

namespace mvcunittesting.controllers
{
    public class employeecontroller : controller
    {
        [nonaction]

        public list<employee> getemployeelist()
        {
            return new list<employee>{
            new employee{
               id = 1,
               name = "maxsu",
               joiningdate = datetime.parse(datetime.today.tostring()),
               age = 23
            },

            new employee{
               id = 2,
               name = "carson",
               joiningdate = datetime.parse(datetime.today.tostring()),
               age = 45
            },

            new employee{
               id = 3,
               name = "kobe bryant",
               joiningdate = datetime.parse(datetime.today.tostring()),
               age = 37
            },

            new employee{
               id = 4,
               name = "laura",
               joiningdate = datetime.parse(datetime.today.tostring()),
               age = 26
            },
         };
        }

        // get: employee
        public actionresult index()
        {
            return view();
        }

        public actionresult employees()
        {
            var employees = from e in getemployeelist()
                            orderby e.id
                            select e;
            return view(employees);
        }
    }
}

要为employee操作方法添加视图,请右键单击employees方法并选择:添加视图…

您将看到视图的默认名称。从“模板”下拉列表中选择“list”,从“模型类”下拉列表中选择“employee”,然后单击“确定”。

现在需要添加一个链接到employees列表,打开views/shared 文件夹下的_layout.cshtml 文件,并在联系人 链接下面添加员工列表 链接。

<li>@html.actionlink("员工列表", "employees", "employee")</li>

以下是_layout.cshtml 的完整实现 -

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@viewbag.title - 我的 asp.net 应用程序</title>
    @styles.render("~/content/css")
    @scripts.render("~/bundles/modernizr")
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @html.actionlink("应用程序名称", "index", "home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@html.actionlink("主页", "index", "home")</li>
                    <li>@html.actionlink("关于", "about", "home")</li>
                    <li>@html.actionlink("联系方式", "contact", "home")</li>
                    <li>@html.actionlink("员工列表", "employees", "employee")</li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @renderbody()
        <hr />
        <footer>
            <p>© @datetime.now.year - 我的 asp.net 应用程序</p>
        </footer>
    </div>

    @scripts.render("~/bundles/jquery")
    @scripts.render("~/bundles/bootstrap")
    @rendersection("scripts", required: false)
</body>
</html>

要从employee控制器测试employees动作方法,需要在单元测试项目中添加另一个测试方法。在homecontrollertest.cs文件中的employeecontrollertest类代码之后,如下所示 -

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.web.mvc;
using microsoft.visualstudio.testtools.unittesting;
using mvcunittesting;
using mvcunittesting.controllers;

namespace mvcunittesting.tests.controllers
{
    [testclass]
    public class homecontrollertest
    {
        [testmethod]
        public void index()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.index() as viewresult;

            // assert
            assert.isnotnull(result);
        }

        [testmethod]
        public void about()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.about() as viewresult;

            // assert
            assert.areequal("your application description page.", result.viewbag.message);
        }

        [testmethod]
        public void contact()
        {
            // arrange
            homecontroller controller = new homecontroller();

            // act
            viewresult result = controller.contact() as viewresult;

            // assert
            assert.isnotnull(result);
        }
    }

    [testclass]
    public class employeecontrollertest
    {
        [testmethod]
        public void employees()
        {
            // arrange
            employeecontroller controller = new employeecontroller();

            // act
            viewresult result = controller.index() as viewresult;

            // assert
            assert.isnotnull(result);
        }
    }
}

测试 菜单中选择:运行 -> 所有测试 项来测试这些操作方法。

可以看到employees测试方法现在也通过了。运行应用程序时将看到以下输出。

点击导航栏中的“员工列表”选项,将看到员工列表信息,如下图所示 -


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册