对数据对象的依赖注入

时间:2015-02-24 12:20:00

标签: python oop design-patterns

我开始为我的(python)应用程序编写测试,我发现依赖注入非常有用。我重构了很多代码,编写测试很容易。但有些课程很棘手。

我有一个类Application,它是包含nametype等属性的数据结构。它还有一些方法返回以某种方式修改了这些属性。没问题,但有一个方法instances(显然)以Process个对象列表的形式返回应用程序的实例。

class Application(object):
    ...
    def instances(self):
        return Processes.all().filtered(lambda process: process.name() == self.name)

您可以看到Processes类的依赖关系。我该怎么办?

我已经通过这种方式实现了它,因为当我从某个地方获得Application个对象时,我可以简单地调用a.instances(),获取进程列表并且不在乎。

但是从测试的角度来看,我想说"嘿嘿应用程序,不要在系统中搜索真实的进程,查看这个模拟的进程列表"。

我想到的第一个可能的解决方案是

def instances(self, processes=None):
    processes = processes if processes else Processes.all()
    return processes.filtered(...)

但这意味着我的所有调用都可能指定了该参数。而a.instances(some_processes_list)并不像a.instances()那么漂亮,可能会令人困惑。你会认为这令人困惑吗?

您会推荐哪种方法或模式?

1 个答案:

答案 0 :(得分:1)

您可以将processes类作为类属性:

class Application(object):
    process_class = Processes
    ...
    def instances(self):
        return self.process_class.all().filtered(lambda process: process.name() == self.name)

并为其分配一个模拟类(TestProcess)进行测试(当然,这个新类应该实现方法' all'并返回你的模拟列表)。

这似乎是一种非常清晰自然的方式,不涉及修补或添加新方法