我是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类我需要它来使用模拟对象而不是真正的数据库对象?
谢谢。
修改 对不起,我的例子还不足以满足我的需要。
让我们看看这个新例子:
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。
我该怎么办?
答案 0 :(得分:7)
答案是,不要写那样的课程。无论如何,这是一种奇怪的方式 - 除了属性和方法定义之外,在类级别应该没有任何可执行代码。您应该使用__init__
方法设置连接。
class Foo(object):
def __init__(self, *args, **kwargs):
DB.connect()
答案 1 :(得分:4)
DB
时,都会在模块的范围内查找 Foo.do_it()
。您可以简单地将一个不同的对象分配给DB
,然后使用它。如果您的班级Foo
位于某个模块foo
中,您可以执行类似
import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()