我有一个Python类,它需要一些数据才能初始化。这些数据通常是通过调用API的另一个模块的函数获得的。我的类的初始化器接受的参数之一是可以用来通过API获取资源的相同ID。
从初始化器内部调用API,并获得它所需的数据将使初始化更短(和更清晰?)。但我担心这会使类更难测试,并在代码深处引入依赖项。
我正试图以一种可维护和可测试的方式设计最好的方法来实现它。
从初始化器中直接调用API模块,并获得完成初始化所需的数据会不好吗?还是从外部调用API并将数据传递给初始化器更好?
<normal"方法>(1)是将依赖的函数、模块或类传递给构造函数本身。
然后,在您的生产代码中,传入真实的东西。在您的测试代码中,传入一个虚拟的测试用例,它的行为将完全符合您对特定测试用例的期望。
这实际上是你假设的两件事之间的中间度量。
换句话说,就像:
def do_something_with(something_generator):
something = something_generator.get()
print(something)
# Real code.
do_something_with(ProductionGenerator())
# Test code.
class TestGenerator:
def get(self):
return 42
do_something_with(TestGenerator())
如果你不愿意总是传递依赖项,你可以使用默认值来解决这个问题,并在函数(如果没有给出)中创建它。:
def do_something(something_generator=None):
if something_generator is None:
local_gen = ProductionGenerator()
else:
local_gen = something_generator
something = something_generator.get()
print(something)
# Real code.
do_something()
# Test code.
class TestGenerator:
def get(self):
return 42
do_something(TestGenerator())
(1)当然,是按照我的方式定义的:-)