如何在Python中模拟类?
我是Python新手,但我曾经使用ruby 我试图用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
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()
顺便说一句,这就是所谓的猴子修补术。斯文,你的答案是正确的,帮助我解决了问题,就像丹尼尔的答案一样,但我需要从中选择一个。抱歉,我希望我能将两者都标记为正确。顺便说一句,这就是所谓的猴子修补。斯文,你的答案是正确的,帮助我解决了问题以及丹尼尔的答案,但我需要选择其中一个。对不起,我希望我能把两者都标记为正确。