Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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
C# 如何在单独的项目中设置ASP.NET API和测试以使用一个IoC/DI容器_C#_Asp.net Mvc_Unit Testing_Asp.net Web Api_Mocking - Fatal编程技术网

C# 如何在单独的项目中设置ASP.NET API和测试以使用一个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容器,使其同时包含生产类和模拟类,但模拟类当然不会与生产代码相互干扰,而是单独定位并仅在测试项目中可见?简短回答,您不会 每个应用程序都应该有自己的。由

我对单元测试还很陌生,有一件事我很挣扎。我想在ASP.NET MVC中创建WebAPI,该测试项目包含控制器的测试方法。我已经读了很多关于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
容器,但归根结底,概念是相同的:

排列
部分:

  • 您可以加载产品注册
  • 您可以创建fakes对象并使用它们覆盖产品注册
  • 您解析测试中的类(现在
    CUT
    将您的伪代码作为依赖项…)

  • 通常,您应该在
    拆卸中释放对象


  • 每个
    IoC
    容器都允许您以不同的方式进行操作
    Autofac
    使用上次注册,
    Castle Windsor
    IsDefualt
    方法(Castle..)等等…

    首先我完全同意@NightOwl888,你不应该在
    UT
    中使用
    IoC
    容器,然而,我看到一些项目中,
    IoC
    与系统代码耦合,在这些情况下,使用
    IoC
    容器很容易注入依赖关系

    在单元测试中,首先模拟要验证的行为的条件,然后执行单元,然后验证行为()。 当您使用
    IoC
    上下文时,您通常使用和
    AAA
    模式相匹配的上下文

    那么,如何设置IoC/DI容器,使其同时包含生产类和模拟类呢

    这有点取决于您使用的
    IoC
    容器,但归根结底,概念是相同的:

    排列
    部分:

  • 您可以加载产品注册
  • 您可以创建fakes对象并使用它们覆盖产品注册
  • 你解决了c