我是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
Run Code Online (Sandbox Code Playgroud)
现在,我想测试我用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
Run Code Online (Sandbox Code Playgroud)
例如,假设数据库已关闭.
当我导入Foo时,它会引发连接错误,我没有时间模拟DB.
我该怎么办??
答案是,不要写那样的课程.无论如何,这是一种奇怪的方式 - 除了属性和方法定义之外,在类级别应该没有任何可执行代码.您应该在__init__方法中设置连接.
class Foo(object):
def __init__(self, *args, **kwargs):
DB.connect()
Run Code Online (Sandbox Code Playgroud)
DBFoo.do_it()每次被调用时都会在模块的作用域中查找。您只需分配一个不同的对象DB即可使用它。如果您的课程Foo位于某个模块中foo,您可以执行类似的操作
import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()
Run Code Online (Sandbox Code Playgroud)