我有疑问我应该测试什么,控制器或型号? 例如,我想要测试用户注册。注册包括一些操作,用于向表中插入附加数据和按输入数据设置用户状态。
我用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方法。
答案 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应用程序(沿着开发的各个阶段):
初始构建/调试技术测试:
使用单元测试框架测试数据层方法(数据库 - >模型),或者您甚至可以引用您的DLL并在一个简单的WinForms测试应用程序中调用您的方法。
< / LI>测试控制器操作 - 可以像在浏览器中打开/ home / index一样简单,也可以像创建另一个TestHarness App一样复杂,以便使用WebClient类调用(例如,如果使用REST / WEB-API)。 / p>
测试WebService调用 - 如果您正在执行WCF或SOAP类型的Web服务,则可以使用SOAP-Ui,其他实现的自定义TestHarness。
控制器/数据访问层工作,转移到功能
几乎准备发布:
希望能帮到你一些!
答案 2 :(得分:0)
您的问题有点难以理解,但基本上完全取决于您的控制器和业务逻辑。如果您的控制器“很薄”,那么您仍然可以测试任何路由规则。例如,是否应根据特定情况重定向用户。大多数测试将针对业务逻辑所在的位置
在任何情况下都需要一个存储库,您需要一个存储库,以便您可以使用依赖注入来实例化Mock存储库以进行测试。这使得您在测试期间实际上不会在数据库中保存任何数据。