如何用Python模拟一个类?

rob*_*okl 1 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
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.

我该怎么办??

Dan*_*man 7

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

class Foo(object):
    def __init__(self, *args, **kwargs):
        DB.connect()
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 6

DBFoo.do_it()每次被调用时都会在模块的作用域中查找。您只需分配一个不同的对象DB即可使用它。如果您的课程Foo位于某个模块中foo,您可以执行类似的操作

import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,这被称为猴子补丁。 (2认同)