Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/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
Unit testing 使用Dependency Inj进行单元测试的依赖打破技术_Unit Testing_Testing_Dependency Injection - Fatal编程技术网

Unit testing 使用Dependency Inj进行单元测试的依赖打破技术

Unit testing 使用Dependency Inj进行单元测试的依赖打破技术,unit-testing,testing,dependency-injection,Unit Testing,Testing,Dependency Injection,目前正在阅读Roy Osherove的《单元测试的艺术》。我大概读了一半,到目前为止,这是一本很棒的书。我要请大家不要讨论容器。他只是简单地提到了他们(实际上,他说国际奥委会不在这本书的范围之内,我不明白,这是我能批评这本书的为数不多的地方之一)。不管怎样,撇开国际奥委会不谈,各种技术包括: 构造函数注入 属性注入 软件工厂与静力学 软件工厂与虚拟方法 方法注入 列表项 好的,我将描述我不喜欢上述每种方法的地方。 1. 构造函数注入-使初始化对象变得混乱和困难,尤其是在必须传递大量依赖项的情况下

目前正在阅读Roy Osherove的《单元测试的艺术》。我大概读了一半,到目前为止,这是一本很棒的书。我要请大家不要讨论容器。他只是简单地提到了他们(实际上,他说国际奥委会不在这本书的范围之内,我不明白,这是我能批评这本书的为数不多的地方之一)。不管怎样,撇开国际奥委会不谈,各种技术包括:

  • 构造函数注入
  • 属性注入
  • 软件工厂与静力学
  • 软件工厂与虚拟方法
  • 方法注入
  • 列表项
  • 好的,我将描述我不喜欢上述每种方法的地方。
    1. 构造函数注入-使初始化对象变得混乱和困难,尤其是在必须传递大量依赖项的情况下。
    2. 财产注入-罗伊似乎喜欢这种技术,但这是我最不喜欢的。如果您有一组依赖项,那么用户必须记住初始化类所需的每个依赖项。我会说这是一个容易出错和混乱的过程。使不熟悉该类的人很难初始化该类。
    3. 软件工厂和静力学——虽然我不认为这是一种糟糕的技术,但我不喜欢依赖于状态。我喜欢处理完全无状态的对象,但到目前为止,我认为这是最好的技术。
    4. 软件工厂和虚拟方法-与上述技术类似,但允许您从类继承,只重写设置依赖项并将其更改为存根的函数。我的想法与第3条类似——这让试图找出单元测试失败原因的人有点困惑。
    5. 方法注入-我只能说。。。为您调用的每个方法传递每个依赖项。说够了

    我想到了另一种方法,我更喜欢上面列出的每一种方法。我通常不鼓励条件编译,但我认为在一些地方,如果你不怎么使用它,它是有意义的。我的建议是对设置测试依赖项的方法的名称进行标准化。例如:

    .InitalizeDepForTesting(IFileSystem file, IDatabase data, IEventLog event, ...)
    
    然后将上述语句包装在条件编译语句中:

    #If DEBUG
          public void InitializeDepForTesting(...)
    #endIf
    
    因此,您的内部依赖项继续按原样工作,不需要更改。您还可以防止弄乱构造函数,并用一堆其他“东西”传递所有依赖项。就您的生产代码而言,没有任何变化,并且很容易一眼就看出您必须如何初始化对象以进行测试。你们都怎么想

    a.)在这一点上,我与PicoContainer的人群是一致的:建筑注射是一条路要走。清晰的语义和定义良好的执行

    b、 )关于您的测试方法:我更喜欢使用模拟,然后依靠IOC进行对象组装。

    a。)我同意PicoContainer的观点:构造函数注入是一种方法。清晰的语义和定义良好的执行


    b、 )关于您的测试方法:我更喜欢使用mock,然后依靠IOC进行对象组装。

    构造注入是更清晰的选择,因为它清楚地建立了您的依赖关系。如果它们太多且令人困惑,这可能表明您的设计存在问题。

    构造注入是更清晰的选择,因为它清楚地建立了您的依赖关系。如果它们太多且令人困惑,这可能表明您的设计存在问题。

    基于构造函数的注入似乎是社区中的赢家(也是我现在唯一使用的方法)

    您要求将IoC从讨论中删除,但这就像要求我们讨论使用记事本编写.Net代码一样。当然可以,但你为什么要这么做?如果使用得当,IoC容器通常允许您在运行时通过一次调用构建整个应用程序。从那时起,所有实例都正确地设置为具有正确的依赖项。这还没有提到单元测试中自动模拟所做的所有工作


    正如其他人指出的那样,如果您有太多的依赖项,以至于您的构造函数让您感到困惑,那么您确实需要重新考虑您的设计。我建议您在读完Roy的优秀著作后,再买一本Bob叔叔写的“干净代码”。

    基于构造函数的注入显然是社区中的赢家(也是我现在唯一使用的方法)

    您要求将IoC从讨论中删除,但这就像要求我们讨论使用记事本编写.Net代码一样。当然可以,但你为什么要这么做?如果使用得当,IoC容器通常允许您在运行时通过一次调用构建整个应用程序。从那时起,所有实例都正确地设置为具有正确的依赖项。这还没有提到单元测试中自动模拟所做的所有工作

    正如其他人指出的那样,如果您有太多的依赖项,以至于您的构造函数让您感到困惑,那么您确实需要重新考虑您的设计。我建议你读完罗伊的好书后再去拿一本鲍勃叔叔写的《干净的代码》

    我要请大家离开国际奥委会 容器不参与讨论

    这样做会产生问题。 我理解你的推理,但是,如果你考虑一个合适的国际奥委会,你的反对意见就变得不成熟了。 我要请大家离开国际奥委会 容器不参与讨论

    这样做会产生问题。
    我理解你的推理,但是,如果你考虑一个合适的IOC,你所有的反对意见都会变得不真实。

    如果你真的拼出了所有的单词,你的问题就更容易阅读了。例如:“有条件补偿”。什么是“红利”?计算汇编还有别的问题吗?如果你