2012-04-23 149 views
2

我最近刚开始使用MVC,因为我听说MVC的主要优势在于它使应用程序单元可测试。在编写第一次单元测试之后,我发现测试内部有很多逻辑的控制器(发送确认电子邮件,使用会话,上下文和其他ASP Net静态)并不总是很简单。编写单元测试需要更多的时间,而不是功能,我不相信这是有用的。MVC 3:测试控制器VS集成测试

我很想将业务逻辑转移到一个“服务”层,它消除了所有ASP Net静态并且可以轻松测试。然后使用Selenium进行集成测试以测试整个功能。

  1. 当测试某个动作非常复杂时(特别是嘲笑输入和设置环境),您是否陷入了困境?

  2. 您是否找到了在控制器中使用业务逻辑的好方法。或者您发现使用服务和控制器代码只是在服务调用上进行中继更好?

  3. 在我看来,测试控制器更像是集成测试,而不是单元测试。你怎么看待这件事?

  4. 您认为单元测试控制器比集成测试有什么优势吗?

回答

3

难道测试时的动作很复杂(尤其是嘲讽输入和建立环境)你坐进情况?

当您的控制器有很多依赖关系并且它们紧密连接到它们时,会发生这种情况。除非它是现有的代码和使修改代码创建更多的麻烦,你应该松散耦合通过接口或抽象类的依赖关系,这让单元测试那么容易。你甚至应该使用Session,Cache和类似对象的包装器。

由于@Dismissile表明,首先你必须重新因数控制器及随后的单元测试会很容易。

您是否找到了一种在控制器中具有业务逻辑的好方法。或者您发现使用服务和控制器代码只是在服务调用上进行中继更好?

控制器不是放置业务逻辑的地方。所有的业务逻辑都应该放在Model类中。控制器的全部责任是与模型交谈并返回视图,json或返回给客户端的任何内容。如果控制器中有复杂的业务逻辑,则应将它们移动到模型类中。

只要你想一想“转储视图..薄控制器..脂肪模型”!

在我看来,测试控制器更像是集成测试而不是单元测试。你怎么看待这件事?

集成测试与单元测试完全不同。在集成测试中,您必须设置应用程序并针对它运行测试用例。在这里,您正在测试每个测试场景中总应用程序的行为,而不是单个单元。单元测试就是测试课堂中各种方法的功能。在单元测试中测试类或方法应该独立于其他类或方法。

但是,当设计一个应用程序单元时,应该牢记测试,否则单元测试将变得与集成测试一样困难,当然它不是单元测试。

您认为单元测试控制器比集成测试有什么优势吗?

与系统级别相比,在单元级别查找和修复错误非常容易。所以答案是肯定的。

我认为你的情况你有一个应用程序有控制器比他们必须做的更多。所以,如果你正在考虑单元测试如此严重,那么你必须在任何你需要的地方重新考虑和松散地依赖它们,否则在编写单元测试方面没有太大的收获。

5

我很想业务逻辑移动到“服务”层,所有的ASP净静的 消除,并且可以很容易地进行测试。然后 使用硒进行集成测试,以测试整个 的功能。

这几乎就在这里。如果你的控制器很复杂,那么他们需要重构。他们根本没有任何商业逻辑。您可以使用Mock框架来模拟服务层,并以这种方式轻松测试您的控制器。

在我看来,测试控制器更相当于集成 测试比单元测试。你怎么看待这件事?

我不同意这一点。您正在测试您的控制器,以确保它根据您提供的输入返回适当的响应。提供一个不存在的ID?重定向到另一个页面或返回一个NotFound视图。模型状态无效?再次返回了同样的看法,等

+0

无法更好或更简洁地解释。 – 2012-04-23 19:10:51