假设有一个class Foo与私人部件的类型酒吧。你不想用户知道这Foo的实施包含一个酒吧,你不想让用户能够创造自己的条,并通过它通过Foo的构造,任何其他方法,或配置文件。

编辑:酒吧也是有问题在于它访问以外的资源控制的测试环境,例如一个特殊的数据库、网络连接,或者另一个进程。

你是做什么的时候你也希望能够单元的测试Foo?是的依赖注射仍然可能吗?这是不是意味着条和Foo太紧耦合(尽管依赖性的一种方式),这种情况是不可接受的一个是吗?

有帮助吗?

解决方案

[声明:我的工作 Typemock]

你有三个备选方案:

  1. 创建一种内部方法,集的酒吧类使用InternalVisibleTo在assemblyInf.cs文件可以让你的测试,以设定。
  2. 使用二要注入酒吧类,在试改变这类与一个虚拟的或假的。
  3. 使用伪造/嘲讽的框架喜欢Typemock隔离(.净额),可以设置假冒行为对象的创建在另一类使用 Isolate.Swap.NextInstance<Bar>.With(fakeBar);

其他提示

您从来没有要隐藏的依赖关系,如果你能帮助它。

如果这是你的代码,你应该做的依赖性明确通过重新设计Bar接受由昂贵的资源产生的对象,而不是直接访问昂贵的资源:移动数据库访问代码(或不管它是什么)出Bar而进入Foo,在这里可以注入测试双打。

如果这是不实际的(即你正在处理别人的班),的德罗尔的名单是很不错的。

如果该栏中键入仅仅是一个富的实现细节,那么你的单元测试永远不需要担心创建酒吧,因为他们只能行使美孚的公共接口反正。

编辑:如果酒吧访问外部资源,那么我会使其成为富的显式依赖,然后要求一个实例来传递到Foo的构造函数,然后可以很容易地嘲笑单元测试

您的问题不在于你需要访问一个私有成员。这只是一个事实,即所讨论的类没有设计成分离的症状。它仅允许一个非常具体的使用情况,这是向上new一个对象都到昂贵的资源。

即使你在身边不可测设计盗号成功,你将仍然只能是做集成测试。单元测试是有关隔离,这是一体化的对立面。因为这类不能被分离,根据定义不能单元进行测试。

是否有一个原因,外部化的依赖性是不希望的?有关此对象从什么是依赖注入像任何其他免它?

修改

我当然明白你的可以的一些弄虚作假隔离。然而,这些技术绕过公共接口,限制未来的灵活性和增大的可能性,有人会打破它(基本上抵消私有成员的有用性)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top