【问题标题】:Unit Test in MVC [closed]MVC中的单元测试[关闭]
【发布时间】:2014-09-29 16:38:46
【问题描述】:

我在我的项目中使用了 mvc5 和 Entity Framework 6。我决定在我的项目中使用 MSTest,但我有几个问题。

例如,我有一个名为 Employee 的类,该类对项目中的其他类有多个依赖关系,例如 company、organization、user。 如果我想为 Employee controller 中的操作创建测试方法,该方法在测试方法中返回与当前用户、公司和组织有关的员工,我必须为员工、用户、公司和组织创建对象,然后我'我可以测试这个动作。

如果我想为测试创建所有对象,我必须在每个测试方法中创建很多对象,这个任务非常耗时,而且我有更复杂的对象,对我的项目中的其他对象有更多的依赖性。

我对这种情况进行了研究,有人建议创建一个包含特定数据的数据库用于测试目的,但我知道单元测试的一个原则是没有使用过数据库,所有测试都应该是可以在内存中运行。

如果我想模拟所有类都是耗时的并且出错的可能性很高。

在这种情况下最好的测试方法是什么? 单元测试是一个不错的选择吗?

在网络上,大多数示例是关于编写单元测试,例如电话号码格式或...类似的东西我在哪里可以找到合适的示例?

【问题讨论】:

    标签: asp.net-mvc unit-testing architecture mstest


    【解决方案1】:

    我认为您将控制器单元测试与存储库类混淆了。

    如果您想对控制器进行单元测试,首先您必须使用依赖注入使其对服务的依赖“松散耦合”。

    现在,加载所有与 Employee 相关的对象是存储库服务的职责,而不是控制器的职责。所以你不能在你的控制器测试中测试它。

    您必须使用假存储库来模拟存储库服务,该存储库返回的对象仅包含控制器工作所需的属性。 然后,在您的控制器测试中,您必须检查它是否对这些数据执行了它必须执行的操作。 当然,您可以对同一个动作进行多次测试,针对接收到的不同类型的数据测试不同的行为。

    测试存储库是一项完全不同的任务。这更加困难,因为要真正测试它,您需要一个真实的数据库。 这取决于您的情况,但我使用的是“测试数据库”,每次启动一些测试时都会清理并填充一些基本数据(或者如果架构发生变化则重新生成)。

    顺便说一句,存储库服务的唯一职责是从数据库加载类,因此它们不需要依赖于其他服务,并且它们的测试永远不会使用模拟。

    【讨论】:

    • 谢谢你们,正如你们所说,我想要测试存储库,但如果我使用数据库,我将失去单元测试的优势
    【解决方案2】:

    通过您的问题细节,我可以说不仅应该涉及单元测试,而且实际上必须设置整个测试过程。我的回答太笼统了,所以我将尝试归结为以下几点建议:

    • 为了获得适当的测试活动,您需要测试环境(至少一个)
    • 单元测试只是必须执行的(测试)级别之一。如您所知,Unit testing 是关于应用程序的最小可测试部分仅此而已。如果您需要涵盖复杂对象的创建、使用等,也许您需要考虑另一个test level。例如,集成测试将帮助您组合应用程序的各个部分,并确定它们是否一起正常工作。

    关于有

    的部分

    模拟所有课程

    在很多情况下使用这种方法是不可避免的,甚至可以提高性能。通过你的适当组合

    类对其他类有多个依赖项

    例如我使用了这样的 mocked Test 对象 并缓存了它,所以它可以在其他测试执行中重复使用。这里非常有用的是Flyweight-design-pattern

    一年前,我不得不从事这样的项目(ASP .Net、实体框架等)并作为解决方案

    在这种情况下最好的测试方法是什么?

    建立一个严肃的Test process,这将帮助您提高软件的可靠性。

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 2012-09-23
      • 2010-12-21
      • 1970-01-01
      • 2010-09-08
      • 2011-11-07
      • 2010-12-21
      • 2017-12-16
      • 1970-01-01
      相关资源
      最近更新 更多