我们有一个控制器,它有一个接受另一个类对象的构造函数。 例如,
ABCController(IXyz obj){this.xyz = obj;}
现在,在单元测试中,在实例化控制器时,我们执行以下操作:
ABCController controller = new ABCController (new Xyz());
我们正在从单元测试项目中注入依赖项,之后我们可以测试Controller的所有方法。
现在最大的问题是,实例化控制器而不是提供/注入依赖项的标准方法是什么?
我同意这就是存在大量模拟/测试框架的原因。但是我们是否需要采用新的框架altogther以避免注入依赖?或注入是最好的权衡,而不是完全采用新的框架?
请告知/澄清。
答案 0 :(得分:1)
依赖注入点是您要注入依赖项。所有模拟框架都可以帮助您创建一个模拟对象以进行测试,而不需要自己创建具有大量样板代码的新测试对象。</ p>
使用容器或DI框架在测试IMO中创建控制器并不是一个好主意,因为您应该知道模拟对象以及您正在创建的内容。
所以你做得对,但是使用Moq或Autofixture来创建一个模拟IXyz进行测试,而不是每次创建一个长手。
答案 1 :(得分:1)
有两种情况可以回答这个问题。首先,如何在测试时确定哪些对象(模拟或存根)。其次,如何配置要在应用程序中注入的依赖项。
<强> 1。测试时
测试时(我的意思是大多数是单元测试),您经常希望将依赖项中的测试代码隔离开来。这里有一个模拟框架(Moq,NSubstitute,Rhino Mocks等)派上用场。这些模拟依赖项,允许您进一步将测试中的代码与更改的依赖项分开。
注意,可以为每个需要注入的接口创建存根类实现。但是,维持一个大型项目可能会很乏味。但是,有些项目喜欢做这样的事情。然而,模拟框架通常提供仅仅是存根的功能。它们提供基于交互的断言,可以记录和回放依赖项上发生的操作。一旦记录下来,这些操作就可以成为测试断言的基础。例如,调用了特定依赖项的次多少次
<强> 2。对于应用程序
在运行时,使用依赖项注入的应用程序需要一种配置和解决依赖关系的方法。依赖项的应用程序配置定义了&#34;控制反转&#34;对于申请过程。在此上下文中,通常引入控件容器(Ninject,Castle Windsor,StructureMap等)的反转来帮助管理依赖关系的配置和解析。
希望这有帮助。