你不应该在另一个类的方法中创建任何其他类的新对象吗?

时间:2017-05-07 08:10:31

标签: unit-testing dependency-injection inversion-of-control

我一直在努力了解依赖注入和Ioc及其所有相关概念,但没有取得多大进展。

我所理解的是让我的类(比如说A)可测试(我的类使用了B类的对象),我应该将对象注入我的类'构造函数中,如下所示:

# Construct a Row-based linked list sparse matrix
P_e_ortho = scipy.sparse.lil_matrix((m, m)) 

P_e_ortho[:, :] = -1/m # Sets all elements
P_e_ortho.setdiag(1-1/m) # Sets the diagonal
P_e_ortho = P_e_ortho.tocsr() # Convert to Compressed Sparse Row matrix

estimator = P_e_ortho.dot(im_deconv.flatten()) # Compute the dot product

所以,我的问题是,在我的任何一个A类方法中,我是否应该永远不会有类似class A{ B class_B_Object; A(B class_B_Object){ this.class_B_Object = class_B_Object; } } 的东西?

2 个答案:

答案 0 :(得分:2)

永远不是一个非常强硬的词,你应该非常小心地使用它。根据{{​​1}}和A的含义,B创建(通常返回)A的实例可能是完全正常的。这里可测试性的要点是,如果B 使用 A的实例并依赖于它的逻辑,那么您应该有一种简单的方法来注入{的模拟实例{1}}这个逻辑被控制(即 - 模拟掉),所以当你为B编写单元测试时,你只是测试它的逻辑,而不是B的基础逻辑。

答案 1 :(得分:1)

使代码易于单独测试的第一步是使用层之间的弱耦合。这意味着您的A类构造函数不应该使用B类,而应该使用某些潜在的IB类可能实现的B接口。这样您就可以使用您可以控制的内容替换单元测试中的此接口 - 模拟,因为您正在测试A类,而不是B

就你关于var classBObject = new B()的问题而言,它实际上取决于具体情况,但总的来说,最好是从外部提供这个实例。