ASP.NET MVC 4单元测试(我应该测试什么)

时间:2015-04-02 01:57:56

标签: c# asp.net asp.net-mvc unit-testing

我有疑问我应该测试什么,控制器或型号? 例如,我想要测试用户注册。注册包括一些操作,用于向表中插入附加数据和按输入数据设置用户状态。

我用Internet模板创建新的应用程序,有UserProfile类,RegisterModel类等。 在控制器代码注册中使用WebSecurity类。

WebSecurity.CreateUserAndAccount(this.Email, this.Password);
WebSecurity.Login(this.Email, this.Password);
Roles.AddUsersToRole(new[] { this.Email }, FSUserRoles.NotValided.ToString());

所有指南都写入创建Repository类,但它如何应用于上面的代码? 如果我把这个代码放到Repository中,那么我应该测试控制器,而控制器会很胖。模型将类似于属性模式,存储库方法将封装用于CRUD操作的EF方法。

3 个答案:

答案 0 :(得分:1)

  

我有问题我应该测试什么,控制器或型号?

答案是两者。包含任何逻辑的每一段代码(不仅仅是业务逻辑,还包括控制器中的逻辑,例如,如果条件为真,则重定向到link1,否则为link2),最好进行单元测试。

测试多少,是我们“开发人员”必须弄清楚的真正问题。

  

例如,我想要测试用户注册。注册包括一些操作,用于向表中插入附加数据和按输入数据设置用户状态。

在我们讨论单元测试时,您将为单元(即类)编写测试。在上面的示例中,您将针对基于不同条件返回不同输出的情况测试控制器方法Register()。例如。如果用户已存在,您将返回失败消息“用户名已存在”。

  

在控制器代码注册中使用WebSecurity类。

在您的控制器中,您可能希望在单元测试期间使用WebSecurity顶部的包装器来模拟它。在编写单元测试时,您将设置IWebSecurityWrapper方法以返回不同的输出,以测试控制器操作的行为。

  

所有指南都写入创建Repository类,但它是如何创建的   适用于上面的代码?如果我将此代码放入Repository,那么我应该这样做   测试控制器,控制器将很胖。模特就像一个   属性模式,存储库方法将封装EF方法   CRUD行动。

存储库模式有助于将表示层与数据访问层隔离开来。同样,整个想法是能够模拟任何代码测试下使用的代码。如果您的控制器或模型类依赖于IDbContext之类的接口,并在运行时发现依赖关系,您将能够在单元测试期间轻松地将其替换为模拟或存根。在单元测试执行期间,这将为您提供更大的控制权,数据来自(在内存中,即集合中)和数据传输的位置。

正如罗伯特哈维在上面的评论中正确指出的那样,知道测试多少的任务非常重要。

希望这能澄清疑点。

答案 1 :(得分:0)

关于存储库,我假设你在谈论数据存储库模式? 以下URL为新概念的人提供了一个很好的示例Repository实现: http://www.codeproject.com/Articles/526874/Repositorypluspattern-cplusdoneplusright

很多时候我在团队之外编写代码我实际上会自己编写代码 DAL并倾向于使用数据优先方法,我发现依赖于数据库引擎 然而,应用程序层的结果将为我提供更好的性能 这会不断增加代码的维护工作量,更不用说要求了 对所使用的基础数据库技术有一定程度的了解。

测试可能是一个非常复杂的过程,取决于您正在构建的内容以及最终最终用户是谁......您的问题的答案可能非常广泛,但是,我会坚持关于我如何做到这一点的一般概述:

单元测试MVC应用程序(沿着开发的各个阶段):

初始构建/调试技术测试:

  1. 使用单元测试框架测试数据层方法(数据库 - >模型),或者您甚至可以引用您的DLL并在一个简单的WinForms测试应用程序中调用您的方法。

    < / LI>
  2. 测试控制器操作 - 可以像在浏览器中打开/ home / index一样简单,也可以像创建另一个TestHarness App一样复杂,以便使用WebClient类调用(例如,如果使用REST / WEB-API)。 / p>

  3. 测试WebService调用 - 如果您正在执行WCF或SOAP类型的Web服务,则可以使用SOAP-Ui,其他实现的自定义TestHarness。

  4. 控制器/数据访问层工作,转移到功能

    1. 测试视图 - 在浏览器中打开您的页面,测试布局/ CSS并确保它按照您的需要显示,浏览器中的F12(调试)和inspect-elements选项是一个重要的工具。
    2. 几乎准备发布:

      1. 测试完全交互 - 实际使用您的页面,因为应用程序旨在使用。在多个浏览器中测试,以确保没有JavaScript / CSS渲染怪异。
      2. 希望能帮到你一些!

答案 2 :(得分:0)

您的问题有点难以理解,但基本上完全取决于您的控制器和业务逻辑。如果您的控制器“很薄”,那么您仍然可以测试任何路由规则。例如,是否应根据特定情况重定向用户。大多数测试将针对业务逻辑所在的位置

在任何情况下都需要一个存储库,您需要一个存储库,以便您可以使用依赖注入来实例化Mock存储库以进行测试。这使得您在测试期间实际上不会在数据库中保存任何数据。