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
.net 国际奥委会能解决我们的问题吗?_.net_Unit Testing_Ioc Container - Fatal编程技术网

.net 国际奥委会能解决我们的问题吗?

.net 国际奥委会能解决我们的问题吗?,.net,unit-testing,ioc-container,.net,Unit Testing,Ioc Container,只是尝试在一个棕地类型的系统中实现单元测试。请注意,我对单元测试领域还比较陌生。当然,这将是一个渐进的迁移过程,因为有太多的痛苦领域 我正在试图解决的当前问题是,我们在VB6工作日以及将应用程序转换为.Net的过程中遵循了许多错误做法。我们有很多共享/静态函数,它们调用其他共享函数,那些调用其他函数等等。有时依赖项作为参数传入,有时它们只是在调用函数中更新。我已经指示我们的开发人员停止创建共享函数,而是创建实例成员,只在接口之外使用这些实例成员,但这并不能缓解当前的情况。因此,对于代码路径和方法

只是尝试在一个棕地类型的系统中实现单元测试。请注意,我对单元测试领域还比较陌生。当然,这将是一个渐进的迁移过程,因为有太多的痛苦领域

我正在试图解决的当前问题是,我们在VB6工作日以及将应用程序转换为.Net的过程中遵循了许多错误做法。我们有很多共享/静态函数,它们调用其他共享函数,那些调用其他函数等等。有时依赖项作为参数传入,有时它们只是在调用函数中更新。我已经指示我们的开发人员停止创建共享函数,而是创建实例成员,只在接口之外使用这些实例成员,但这并不能缓解当前的情况。因此,对于代码路径和方法签名中的每个函数,必须在顶层递归地传递每个依赖项

我希望这是国际奥委会能够解决的问题。目前我们正在使用NUnit/Moq,我开始研究StructureMap。到目前为止,我了解到您几乎告诉StructureMap for x interface我希望默认为具体的类y:

ObjectFactory.Initialize(x=>{x.ForRequestType<IInterface>().TheDefaultIsConcreteType<MyClass>()});
ObjectFactory.Initialize(x=>{x.ForRequestType().TheDefaultIsConcreteType()});
然后到运行时:

var mytype = ObjectFactory.GetInstance<IInterface>();
var mytype=ObjectFactory.GetInstance();

IOC容器将为您初始化正确的类型。目前还不确定如何将一个假输入替换为具体类型,但希望这很简单。国际奥委会会解决我上面提到的问题吗?是否有一个特定的IOC框架比StructureMap做得更好,或者他们都能处理这种情况。任何帮助都将不胜感激。

不过,这并不是什么灵丹妙药

注意:应该在应用程序根目录下设置IOC容器。不是临时的。否则,您将实现一个反模式的服务定位器


遵循生产代码的构造注入,让IOC容器解决依赖关系。对于单元测试,您只需硬编码依赖项。这将允许您使用模拟对象(双重测试)。换句话说,IOC与单元测试无关

IoC在摆脱静态方法和避免依赖项委托方面非常出色,因为每个类都可以很容易地显式声明所有依赖项

关于单元测试,有两个阵营:

  • 在IOC容器中插入mock作为依赖项的实例,您不希望在特定情况下对其进行测试,并让容器像往常一样解析。如果您想将多个类作为一个集成组件进行测试,那么这种方法尤其有效
  • 模拟构建类的单个对象以手动测试和插入这些对象所需的所有实例。如果您希望坚持单独测试每个类(您的单元是一个类),那么这种方法尤其有效

感谢Finglas的回复。这到底是什么样子?它是否消除了每个方法调用中的所有依赖参数?在进行单元测试时,如何轻松地通过每个依赖项的伪造?实际上,我对IoC到底是什么感到困惑。正如您在上面所说的,您不会将IoC仅用于生产代码的测试代码。您仍然使用构造函数注入,但只使用IoC,因此您不必坐在那里让使用您的类的人在每个参数中都传递。帮助我理解国际奥委会的是在DnrTV观看詹姆斯·科瓦奇的一段视频,其中包括他自己制作的一个简单的国际奥委会容器。非常有趣!!嗯,我不知道国际奥委会在这件事上能帮多少忙。依赖性/初始化图到处都是。你不可能一次完成所有的工作,但是通过一点计划,你应该能够以增量的方式完成。这可能意味着在中间阶段创建一些不太漂亮的代码,但不要灰心,这是可以做到的:)祝你好运@用户-每个构造函数仍然有参数。IOC容器意味着您将编写一部分代码来连接依赖项。测试将与往常一样,手动连接依赖项,以允许测试双重项交换入和出。查看一些关于国际奥委会的文章,我个人使用Ninject。DI是一个需要掌握的更重要的概念,没有DI,您会发现测试很困难。