我开始为我的(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()漂亮,可能会造成混淆。您是否会感到困惑?

您会建议采用哪种方法或模式?

最佳答案

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

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


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

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

关于python - 对数据对象的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28695654/

10-11 10:38