Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 用dependecny注入对控制器进行单元测试_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 4 用dependecny注入对控制器进行单元测试

Asp.net mvc 4 用dependecny注入对控制器进行单元测试,asp.net-mvc-4,Asp.net Mvc 4,我们有一个控制器,它有一个接受另一个类对象的构造函数。 比如说, ABCController(IXyz obj){this.xyz = obj;} 现在,在单元测试中,在实例化conroller时,我们执行如下操作: ABCController controller = new ABCController (new Xyz()); 我们正在注入单元测试项目中的依赖项,之后我们可以测试控制器的所有方法 现在最大的问题是,实例化控制器而不是提供/注入依赖关系的标准方法是什么 我同意这就是存在大量

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

ABCController(IXyz obj){this.xyz = obj;}
现在,在单元测试中,在实例化conroller时,我们执行如下操作:

ABCController controller = new ABCController (new Xyz());
我们正在注入单元测试项目中的依赖项,之后我们可以测试控制器的所有方法

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

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


请建议/澄清。

依赖项注入的要点是您希望注入依赖项。模拟框架所做的一切都是帮助您创建一个模拟对象来注入测试,而不需要自己用大量样板代码创建新的测试对象

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


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

回答这个问题有两个上下文。首先,在测试时如何确定哪些对象(模拟或存根)。第二,如何配置要在应用程序中注入的依赖项

1。测试时

在测试时(我指的主要是单元测试),您通常希望将测试中的代码与依赖项隔离开来。这里有一个模拟框架(Moq、NSubstitute、rhinomocks等)很方便。这些模拟依赖项,并允许您进一步将测试中的代码与更改的依赖项分开

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

2。对于应用程序

在运行时,使用依赖项注入的应用程序需要一种配置和解析依赖项的方法。依赖项的应用程序配置定义了应用程序流程的“控制反转”。在这种情况下,通常会引入控制反转容器(Ninject、Castle Windsor、StructureMap等)来帮助管理依赖项的配置和解析

希望这有帮助