我一直在努力了解依赖注入和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;
}
}
的东西?
答案 0 :(得分:2)
永远不是一个非常强硬的词,你应该非常小心地使用它。根据{{1}}和A
的含义,B
创建(通常返回)A
的实例可能是完全正常的。这里可测试性的要点是,如果B
使用 A
的实例并依赖于它的逻辑,那么您应该有一种简单的方法来注入{的模拟实例{1}}这个逻辑被控制(即 - 模拟掉),所以当你为B
编写单元测试时,你只是测试它的逻辑,而不是B
的基础逻辑。
答案 1 :(得分:1)
使代码易于单独测试的第一步是使用层之间的弱耦合。这意味着您的A
类构造函数不应该使用B
类,而应该使用某些潜在的IB
类可能实现的B
接口。这样您就可以使用您可以控制的内容替换单元测试中的此接口 - 模拟,因为您正在测试A
类,而不是B
。
就你关于var classBObject = new B()
的问题而言,它实际上取决于具体情况,但总的来说,最好是从外部提供这个实例。