如何在Python中模拟类?

如何在Python中模拟类?,python,testing,Python,Testing,我是Python新手,但我曾经使用ruby 我试图用Python进行一些测试,但我不知道如何为测试模拟类 假设我有一门真正的课: from database import DB class Foo: def do_it(self): x = {'key': 'value'} DB.save(x) # do other stuff with x return x 现在,我想测试我对x所做的一切是否都返回了正确的结果,我想测试是否使用x作为参数调用了DB.sav

我是Python新手,但我曾经使用ruby

我试图用Python进行一些测试,但我不知道如何为测试模拟类

假设我有一门真正的课:

from database import DB
class Foo:
  def do_it(self):
    x = {'key': 'value'}
    DB.save(x)
    # do other stuff with x
    return x
现在,我想测试我对x所做的一切是否都返回了正确的结果,我想测试是否使用x作为参数调用了DB.save,但我不想实际将x保存到数据库中。为了查看是否调用了DB.save,我可以使用一些模拟框架,但是如何告诉Foo类我需要它来使用模拟对象而不是真正的DB对象呢

多谢各位

编辑: 对不起,我的例子不足以完成我需要完成的任务

让我们看看这个新的例子:

from database import DB
class Foo:
  DB.connect()
  def do_it(self):
    x = {'key': 'value'}
    DB.save(x)
    # do other stuff with x
    return x
例如,假设数据库已关闭

当我导入Foo时,它会引发连接错误,我没有时间模拟DB


我该怎么办?

DB
将在每次调用
Foo.do_it()
时在模块的作用域中查找。您只需将不同的对象分配给
DB
,即可使用它。如果您的类
Foo
在某个模块
Foo
中,您可以执行以下操作

import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()

每次调用
Foo.do_it()
时,都会在模块的作用域中查找
DB
。您只需将不同的对象分配给
DB
,即可使用它。如果您的类
Foo
在某个模块
Foo
中,您可以执行以下操作

import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()

答案是,不要这样写你的类。无论如何,这样做是一种奇怪的方式——除了属性和方法定义之外,在类级别不应该有任何可执行代码。您应该在
方法中设置连接

class Foo(object):
    def __init__(self, *args, **kwargs):
        DB.connect()

答案是,不要这样写你的类。无论如何,这样做是一种奇怪的方式——除了属性和方法定义之外,在类级别不应该有任何可执行代码。您应该在
方法中设置连接

class Foo(object):
    def __init__(self, *args, **kwargs):
        DB.connect()

顺便说一句,这就是所谓的猴子修补术。斯文,你的答案是正确的,帮助我解决了问题,就像丹尼尔的答案一样,但我需要从中选择一个。抱歉,我希望我能将两者都标记为正确。顺便说一句,这就是所谓的猴子修补。斯文,你的答案是正确的,帮助我解决了问题以及丹尼尔的答案,但我需要选择其中一个。对不起,我希望我能把两者都标记为正确。