使用依赖注入对Controller进行单元测试

时间:2014-05-05 06:51:21

标签: asp.net-mvc-4

我们有一个控制器,它有一个接受另一个类对象的构造函数。 例如,

ABCController(IXyz obj){this.xyz = obj;}

现在,在单元测试中,在实例化控制器时,我们执行以下操作:

ABCController controller = new ABCController (new Xyz());

我们正在从单元测试项目中注入依赖项,之后我们可以测试Controller的所有方法。

现在最大的问题是,实例化控制器而不是提供/注入依赖项的标准方法是什么?

我同意这就是存在大量模拟/测试框架的原因。但是我们是否需要采用新的框架altogther以避免注入依赖?或注入是最好的权衡,而不是完全采用新的框架?

请告知/澄清。

2 个答案:

答案 0 :(得分:1)

依赖注入点是您要注入依赖项。所有模拟框架都可以帮助您创建一个模拟对象以进行测试,而不需要自己创建具有大量样板代码的新测试对象。<​​/ p>

使用容器或DI框架在测试IMO中创建控制器并不是一个好主意,因为您应该知道模拟对象以及您正在创建的内容。

所以你做得对,但是使用Moq或Autofixture来创建一个模拟IXyz进行测试,而不是每次创建一个长手。

答案 1 :(得分:1)

有两种情况可以回答这个问题。首先,如何在测试时确定哪些对象(模拟或存根)。其次,如何配置要在应用程序中注入的依赖项。

<强> 1。测试时

测试时(我的意思是大多数是单元测试),您经常希望将依赖项中的测试代码隔离开来。这里有一个模拟框架(Moq,NSubstitute,Rhino Mocks等)派上用场。这些模拟依赖项,允许您进一步将测试中的代码与更改的依赖项分开。

注意,可以为每个需要注入的接口创建存根类实现。但是,维持一个大型项目可能会很乏味。但是,有些项目喜欢做这样的事情。然而,模拟框架通常提供仅仅是存根的功能。它们提供基于交互的断言,可以记录和回放依赖项上发生的操作。一旦记录下来,这些操作就可以成为测试断言的基础。例如,调用了特定依赖项的多少次

<强> 2。对于应用程序

在运行时,使用依赖项注入的应用程序需要一种配置和解决依赖关系的方法。依赖项的应用程序配置定义了&#34;控制反转&#34;对于申请过程。在此上下文中,通常引入控件容器(Ninject,Castle Windsor,StructureMap等)的反转来帮助管理依赖关系的配置和解析。

希望这有帮助。