C# 如何在单独的项目中设置ASP.NET API和测试以使用一个IoC/DI容器
我对单元测试还很陌生,有一件事我很挣扎。我想在ASP.NET MVC中创建WebAPI,该测试项目包含控制器的测试方法。我已经读了很多关于IoC/DI的书,我已经在其他项目中使用过它,但没有在单元测试中使用过。IoC/DI的许多建议之一就是经常提到测试方法的模拟类注入,但我从来没有找到一种方法来使用单独的项目来实现它C# 如何在单独的项目中设置ASP.NET API和测试以使用一个IoC/DI容器,c#,asp.net-mvc,unit-testing,asp.net-web-api,mocking,C#,Asp.net Mvc,Unit Testing,Asp.net Web Api,Mocking,我对单元测试还很陌生,有一件事我很挣扎。我想在ASP.NET MVC中创建WebAPI,该测试项目包含控制器的测试方法。我已经读了很多关于IoC/DI的书,我已经在其他项目中使用过它,但没有在单元测试中使用过。IoC/DI的许多建议之一就是经常提到测试方法的模拟类注入,但我从来没有找到一种方法来使用单独的项目来实现它 那么,我如何设置IoC/DI容器,使其同时包含生产类和模拟类,但模拟类当然不会与生产代码相互干扰,而是单独定位并仅在测试项目中可见?简短回答,您不会 每个应用程序都应该有自己的。由
那么,我如何设置IoC/DI容器,使其同时包含生产类和模拟类,但模拟类当然不会与生产代码相互干扰,而是单独定位并仅在测试项目中可见?简短回答,您不会 每个应用程序都应该有自己的。由于单元测试放在一个单独的项目中,并在WebApi项目的单独进程下运行,因此它们是单独的应用程序。因此,它们将具有单独的DI配置。简而言之,1个可执行进程==1个组合根 DI是一种模式。信息技术因此,WebApi项目和单元测试项目都不需要DI容器 虽然有些人更喜欢在单元测试期间使用DI容器,但对我来说,这似乎有些过分。单元测试是一次测试一个被测试的类。测试场景中的其余类都应该是存根或模拟。如果遵循良好的设计实践(不使用),那么在一个场景中,您通常不会有超过4个实例—测试中的类和最多3个假类。使用
new
关键字创建这些实例不仅更简单,而且使单元测试更容易理解。单元测试的一个重要方面是使它们易于理解,这样其他人就可以很容易地看到正在测试的内容以及如何在文档不清楚时使用它们来理解API
在集成测试或用户接受测试中,您可以考虑更认真地使用DI来组合组件,因为在这些情况下,通常有一个以上的测试类组合在一起。
< P>简短的回答,您不必。 每个应用程序都应该有自己的。由于单元测试放在一个单独的项目中,并在WebApi项目的单独进程下运行,因此它们是单独的应用程序。因此,它们将具有单独的DI配置。简而言之,1个可执行进程==1个组合根 DI是一种模式。信息技术因此,WebApi项目和单元测试项目都不需要DI容器 虽然有些人更喜欢在单元测试期间使用DI容器,但对我来说,这似乎有些过分。单元测试是一次测试一个被测试的类。测试场景中的其余类都应该是存根或模拟。如果遵循良好的设计实践(不使用),那么在一个场景中,您通常不会有超过4个实例—测试中的类和最多3个假类。使用new
关键字创建这些实例不仅更简单,而且使单元测试更容易理解。单元测试的一个重要方面是使它们易于理解,这样其他人就可以很容易地看到正在测试的内容以及如何在文档不清楚时使用它们来理解API
在集成测试或用户接受测试期间,您可以考虑更认真地使用DI来组合组件,因为在这些情况下,通常有一个以上的测试类组合在一起。
首先,我完全同意@ NigToLL88,不应在<代码> UT < /代码>中使用<代码> IOC 容器,然而,我看到一些项目中,
IoC
与系统代码耦合,在这些情况下,使用IoC
容器很容易注入依赖关系
在单元测试中,首先模拟要验证的行为的条件,然后执行单元,然后验证行为()。
当您使用IoC
上下文时,您通常使用和AAA
模式相匹配的上下文
那么,如何设置IoC/DI容器,使其同时包含生产类和模拟类呢
这有点取决于您使用的IoC
容器,但归根结底,概念是相同的:
在排列
部分:
CUT
将您的伪代码作为依赖项…)拆卸中释放对象
每个
IoC
容器都允许您以不同的方式进行操作Autofac
使用上次注册,Castle Windsor
有IsDefualt
方法(Castle..)等等…首先我完全同意@NightOwl888,你不应该在UT
中使用IoC
容器,然而,我看到一些项目中,IoC
与系统代码耦合,在这些情况下,使用IoC
容器很容易注入依赖关系
在单元测试中,首先模拟要验证的行为的条件,然后执行单元,然后验证行为()。
当您使用IoC
上下文时,您通常使用和AAA
模式相匹配的上下文
那么,如何设置IoC/DI容器,使其同时包含生产类和模拟类呢
这有点取决于您使用的IoC
容器,但归根结底,概念是相同的:
在排列
部分: