Owe*_*enP 8 c# testing inversion-of-control
其余问题的更短版本:我遇到了问题,而IoC容器是一个工具.问题听起来像是IoC可以解决的问题,但我还没有阅读足够的工具说明以确定.我很好奇,如果我选错了工具或说明书的哪一章我可以跳过去寻求帮助.
我在Windows窗体控件库上工作.在过去的一年里,我偶然发现了单元测试,并对提高自动化测试的质量充满热情.测试控制很困难,并且在线没有太多关于它的信息.其中一个令人讨厌的事情是交互逻辑与UI胶水的分离,它调用它导致每个控件具有比我通常认为对于类健康更多的依赖性.在测试它们与控件的集成时为这些元素创建假货非常繁琐,我正在研究IoC的解决方案.
有一个障碍我不确定如何克服.要设置容器,您需要有一些在应用程序其余部分之前运行的引导程序代码.在一个应用程序中,这个东西有一个非常明确的地方.在图书馆,它不是那么清楚.
想到的第一个解决方案是创建一个类,该类提供容器的静态实例,并在其类型初始值设定项中设置容器.这适用于运行时,但在测试环境中,我不确定它的效果如何.允许测试并行运行,许多测试需要不同的依赖关系,因此静态共享状态将是一场噩梦.这让我相信容器创建应该是一个实例方法,但是我有一个鸡和蛋问题,因为控件必须在它创建自己之前构造它的容器.想到控件的类型初始值设定项,但我的测试将无法修改此行为.这让我想到使容器本身成为控件的依赖,其中用户可见的构造函数提供运行时默认实现,但是这要由我的测试来设置自己的容器.我没有考虑过这个问题,但似乎这与我现在的工作水平相同:每次测试必须初始化3-5个依赖项的测试.
通常情况下,我会自己尝试很多东西,看看有什么疼.我目前处于严格的期限之下,所以在编写代码时我没有太多时间进行实验; 我只是在短暂的时间内思考这个问题并且没有太多的论文.我确定其他人也遇到过类似的问题,所以如果我不需要重新发明轮子那就太好了.
还有其他人攻击过这个问题吗?是否有一些战略可以满足这些需求?由于我的经验不足,我只是一个新手和过于复杂的事情吗?如果是后者,我会喜欢你想分享的任何资源来解决我的无知.
更新:
我想回应Mark Seeman的回答,但它需要比评论字段允许的更多字符.
我已经玩弄了演示模型模式.在这种情况下,视图是公共控件类,每个视图都有一个或多个控制器类.当在控件上触发某个UI事件时,它执行的唯一逻辑是决定需要调用哪些控制器方法.
探索这种设计的简短表达是我的控制器类与它们的视图紧密耦合.根据DI容器使用松散耦合代码的说法,我正在阅读"错误的工作工具".我可能能够设计一个更松散耦合的架构,此时DI容器可能更容易使用.但这需要一些重大的努力,而且需要对已发布的代码进行大修; 我会不得不尝试新的东西,然后匆匆走近旧的东西.这是另一天的问题.
为什么我甚至想要注入强耦合类型而不是使用本地默认值?一些接缝旨在成为高级用户的可扩展点.我必须测试涉及不正确实现的各种场景,并验证我是否符合我的合同; 模拟对象非常适合.
对于目前的设计,克里斯巴拉德关于"穷人的DI"的建议是我或多或少关注的,对于我的强耦合类型,这只是很多繁琐的设置.我有这个愿景,我能够将所有这些乏味的东西推到一些DI容器设置方法中,但是我越努力证明这种方法,我就越相信我会变成我试图用大锤挂图片.
我会等待24小时左右,看看在接受之前是否进一步讨论.
根据您的框架的复杂程度,您可能会摆脱基于手动编码构造函数的依赖项注入,使用无参数默认构造函数(使用正常的具体实现),但使用第二个构造函数来注入依赖项以用于单元测试目的,例如。
private IMyDependency dependency;
public MyClass(IMyDependency dependency)
{
this.dependency = dependency;
}
public MyClass() : this(new MyDefaultImplementation())
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |