如何用Python模拟一个类?

时间:2011-04-11 14:42:08

标签: 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.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。

我该怎么办?

2 个答案:

答案 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()